[英]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 tn
的SELECT COUNT(DISTINCT tn.tid) FROM term_node tn
SELECT COUNT(*) FROM term_node tn
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.