1

のようなテーブル tb_tag_article があります

CREATE TABLE `tb_tag_article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tag_id` int(16) NOT NULL,
  `article_id` int(16) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `key_tag_id_article_id` (`tag_id`,`article_id`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=365944 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

このようにクエリを実行すると、結果は5120になります。

SELECT count(*) FROM tb_tag WHERE tag_id = 43

しかし、このようにクエリを説明すると

EXPLAIN SELECT count(*) FROM tb_tag WHERE tag_id = 43

検査された行は13634です。

+------+-------------+----------------+------+-----------------------+-----------------------+---------+-------+-------+-------------+
| id   | select_type | table          | type | possible_keys         | key                   | key_len | ref   | rows  | Extra       |
+------+-------------+----------------+------+-----------------------+-----------------------+---------+-------+-------+-------------+
|    1 | SIMPLE      | tb_tag_article | ref  | key_tag_id_article_id | key_tag_id_article_id | 4       | const | 13634 | Using index |
+------+-------------+----------------+------+-----------------------+-----------------------+---------+-------+-------+-------------+

クエリはインデックスを使用しますが、検査された行の数は実際のデータの数よりも多くなります。どうしたの?

4

2 に答える 2

0

Q: 何が問題なのですか?

A:問題ないようです。

EXPLAIN 出力の " " 列の値rowsは推定値であり、正確な数値ではありません。

参照: http://dev.mysql.com/doc/refman/5.5/en/explain-output.html


考えられる各アクセス パスの「コスト」を評価するために、オプティマイザは、インデックスに対する範囲スキャン操作とテーブル内のすべての行のフル スキャンを使用した場合の効率を比較するために、見積もりの​​みを必要とします。オプティマイザーは、テーブル内の合計行数の「正確な」カウント、または述語を満たす行数を必要としません。

この単純なクエリの場合、MySQL が考慮する可能性のあるプランは 2 つだけです。

そして、その 13684 という見積もりは、正確な行数からそれほど離れていません。2.5 倍ずれていますが、MySQL は適切な実行計画を考え出しています。つまり、テーブル内のすべての行をチェックするのではなく、インデックスを使用しています。

問題はない。

于 2014-10-06T14:58:11.333 に答える
0

MySQL リファレンスから ( http://dev.mysql.com/doc/refman/5.0/en/explain-output.html#explain_rows ):

行の列は、MySQL がクエリを実行するために調べる必要があると考える行の数を示します。

InnoDB テーブルの場合、この数値は推定値であり、常に正確であるとは限りません。

また、インデックスを分析する必要があるため、インデックス内のレコード数とテーブル内のレコード数を考慮に入れている可能性もあります。しかし、それは単なる仮説です。

また、MySQL 5.1 には、Explain Row 推定のバグがあり、数が大幅にずれていたようです: http://bugs.mysql.com/bug.php?id=53761奇妙さの。

ドキュメントからの主なポイントは、EXPLAIN 行列を一粒の塩でツリー化することのようです。

于 2014-10-06T14:56:24.460 に答える