1

WHERE 句で IN を使用して MySQL で内部結合を実行するときに、テーブル全体のスキャンを回避するにはどうすればよいですか? 例えば:

explain SELECT
-> COUNT(DISTINCT(n.nid))
-> FROM node n
-> INNER JOIN term_node tn ON n.nid = tn.nid
-> INNER JOIN content_type_article ca ON n.nid = ca.nid
-> WHERE tn.tid IN (67,100)
-> ;
+----+-------------+-------+--------+----------------------------------+---------+---------+----------------------+-------+--------------------------+
| id | select_type | table | type   | possible_keys                    | key     | key_len | ref                  | rows  | Extra                    |
+----+-------------+-------+--------+----------------------------------+---------+---------+----------------------+-------+--------------------------+
|  1 | SIMPLE      | tn    | ALL    | PRIMARY,nid                      | NULL    | NULL    | NULL                 | 42180 | Using where              |
|  1 | SIMPLE      | ca    | ref    | nid,field_article_date_nid_index | nid     | 4       | drupal_mm_qas.tn.nid |     1 | Using index              |
|  1 | SIMPLE      | n     | eq_ref | PRIMARY                          | PRIMARY | 4       | drupal_mm_qas.ca.nid |     1 | Using where; Using index |
+----+-------------+-------+--------+----------------------------------+---------+---------+----------------------+-------+--------------------------+
3 rows in set (0.00 sec)
4

1 に答える 1

0

mysql が十分に選択的でないと識別した列でフィルタリングしているようです。フィルタのカーディナリティが低すぎる (つまり、そのフィルタの個別の行数が少ない) 場合、mysql はほとんどの場合、fts の方が高速であると正確に判断します。

SELECT COUNT(DISTINCT tn.tid) FROM term_node tn確認するには、との結果を表示してくださいSELECT COUNT(*) FROM term_node tn

于 2013-10-07T18:19:22.403 に答える