MySQL оптимизация - использование индекса - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующий ИНДЕКС в таблице a:

SHOW INDEX FROM a

Таблица, Non_unique, Key_name, Seq_in_index, Column_name, Collation, Cardinality, Sub_part, Packed, Null, Index_type, Comment, Index_comment

a, '1', 'oc_id', '1', 'OC_ID', 'A', '19', NULL, NULL, 'YES', 'BTREE', '', ''

И план explain показывает, что он используется:

EXPLAIN SELECT * FROM a
WHERE OC_ID IN (
                5841)

'1', 'SIMPLE', a, 'ref', 'oc_id,oc1', 'oc_id', '6', 'const', '121080', 'Using where'

Но, используя подзапрос, он не используется:

EXPLAIN SELECT * FROM a
WHERE OC_ID IN (SELECT OC_ID FROM b WHERE tteci = "54301")

'1', 'PRIMARY', a, 'ALL', NULL, NULL, NULL, NULL, '701145408', 'Using where'
'2', 'DEPENDENT SUBQUERY', b, 'index_subquery', 'OC_ID,tteci1', 'OC_ID', '6', 'func', '1', 'Using where'

Что я делаю не так?

1 Ответ

0 голосов
/ 29 июня 2018

для повышения производительности вы можете использовать объединение вместо предложения IN на основе результата выборки

SELECT * 
FROM a
INNER  JOIN b ON a.OC_ID = b.OC_ID and b.tteci =  "54301" 

для индекса вы должны использовать составной со столбцами, включенными в предложение JOIN, например, для таблицы b:

(tteci, OC_ID) 

для таблицы a достаточно индекса OC_ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...