2010-11-07 20 views
1

我的查詢似乎與http://dev.mysql.md/doc/refman/5.1/en/in-subquery-optimization.html中的示例非常相似,但不幸的是,本手冊中的收據不適用於我。如何優化MySQL中的IN子查詢?

當我分開運行,內部和外部的查詢使用索引,但是當我運行整個查詢,外部查詢掃描整個表...

的mysql>解釋選擇SMSID FROM SMSDelivery WHERE SMSID IN( SELECT SMSID FROM SMS WHERE phoneNumber的= '123456' OR FROMUSER = '5678p' OR TOUSER = '5124p')\ G變

*************************** 1. row *************************** 
      id: 1 
    select_type: PRIMARY 
    table: SMSDelivery 
    type: index 
    possible_keys: NULL 
    key: FK75C784D70BE5EC9 
    key_len: 4 
    ref: NULL 
    rows: 1337017 
    Extra: Using where; Using index 

*************************** 2. row *************************** 
    id: 2 
    select_type: DEPENDENT SUBQUERY 
    table: SMS 
    type: unique_subquery 
    possible_keys: PRIMARY,phoneNumber,fromUser,toUser 
    key: PRIMARY 
    key_len: 4 
    ref: func 
    rows: 1 
    Extra: Using where 
    2 rows in set (0.00 sec) 

回答

0

你能試試這個:

EXPLAIN 
SELECT 
sd.* 
FROM 
SMSDelivery sd 
INNER JOIN 
(
SELECT smsId FROM SMS WHERE phoneNumber='123456' OR fromUser='5678p' OR toUser='5124p' 
) s ON sd.smsId = s.smsId; 
+0

非常感謝你 - 內部聯接使用索引,而不是表掃描! – Vitaly 2010-11-07 19:40:32

+0

您也可以使用'EXISTS'而不是'IN' – gkalikapersaud 2016-12-16 17:58:40