Оптимизирование IN в запросе

К сожалению, MySql 5.5 не всегда правильно подбирает план запроса для конструкции IN().

Например, следующий запрос должен использовать составной индекс первичного ключа:

EXPLAIN SELECT * FROM tbl1
WHERE (col1, col2) IN (
      (732727758,102),(732728118,102),(732728298,102),(732728478,102),
      (732735678,102),(962074728,102),(964153098,102),(2027956818,102),
      (2034233178,102),(2034233538,102))\G
*************************** 1. ROW ***************************
           id: 1
  select_type: SIMPLE
        TABLE: tbl1
         TYPE: ALL
possible_keys: NULL
          KEY: NULL
      key_len: NULL
          REF: NULL
         ROWS: 1379
        Extra: USING WHERE

Запросы типа этого обычно следует переписывать, для того чтобы они использовали поиск используя гораздо меньшеe число строк в сравнии с просмтором всей таблицы.

EXPLAIN SELECT * FROM tbl1
WHERE (col1=732727758 AND col2=102)
   OR (col1=732728118 AND col2=102)
   OR (col1=732728298 AND col2=102)
   OR (col1=732728478 AND col2=102)
   OR (col1=732735678 AND col2=102)
   OR (col1=962074728 AND col2=102)
   OR (col1=964153098 AND col2=102)
   OR (col1=2027956818 AND col2=102)
   OR (col1=2034233178 AND col2=102)
   OR (col1=2034233538 AND col2=102)\G
*************************** 1. ROW ***************************
           id: 1
  select_type: SIMPLE
        TABLE: tbl1
         TYPE: range
possible_keys: PRIMARY
          KEY: PRIMARY
      key_len: 10
          REF: NULL
         ROWS: 10
        Extra: USING WHERE

без комментариев :)

comments powered by Disqus