2013-10-07 32 views
1

如何避免在WHERE子句中使用IN執行MySQL內部連接時執行全表掃描?例如:在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) 
+1

結果請出示的指標,特別是對錶'term_node'。 – nosid

回答

0

看來你是通過一個列進行過濾,而這個列被mysql識別爲不夠有選擇性。當過濾器的基數太低(即該過濾器的不同行數很少)時,mysql在大多數情況下都認爲fts會更快。

要進行確認,請出示的SELECT COUNT(DISTINCT tn.tid) FROM term_node tnSELECT COUNT(*) FROM term_node tn