繁体   English   中英

使用WHERE子句中的IN在MySQL中执行内部联接时避免全表扫描

[英]Avoiding full table scan when performing inner joins in MySQL using IN in WHERE clause

在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)

看来您正在筛选一列mysql识别为选择性不够的列。 当一个过滤器的基数太低(即该过滤器的不同行数很低)时,mysql认为,在大多数情况下,准确地说,英尺数会更快。

为了确认,请显示SELECT COUNT(DISTINCT tn.tid) FROM term_node tnSELECT COUNT(DISTINCT tn.tid) FROM term_node tn SELECT COUNT(*) FROM term_node tn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM