Как оптимизировать подзапрос IN в MySQL?

Мой запрос очень похож на пример из http://dev.mysql.md/doc/refman/5.1/en/in-subquery-optimization.html, но, к сожалению, рецепты из этого руководства у меня не работают.

Когда я запускаю их по отдельности, как внутренние, так и внешние запросы используют индексы, но когда я запускаю весь запрос, внешний запрос сканирует всю таблицу...

mysql> объясните, выберите smsId FROM SMSDelivery WHERE smsId IN (SELECT smsId FROM SMS WHERE phoneNumber='123456' OR fromUser='5678p' ИЛИ ​​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)

person Vitaly    schedule 07.11.2010    source источник


Ответы (1)


можешь попробовать это:

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;
person Jon Black    schedule 07.11.2010
comment
большое спасибо - внутреннее соединение использует индексы, а не сканирование таблицы! - person Vitaly; 07.11.2010
comment
Вы также можете использовать «EXISTS» вместо «IN» - person Gavindra Kalikapersaud; 16.12.2016