У меня есть следующие таблицы:
|ELEMENTS|
------------
|id_element|
|id_catalog|
|value|
|CATALOG|
------------
|id_catalog|
|catalog_name|
|show|
|status|
Я пытался добавить разные индексы (несколько вариантов):
1) ELEMENT: pair(id_element, id_catalog) and id_element and id_catalog
2) ELEMENT: pair(id_element, id_catalog) and id_element
3) ELEMENT: pair(id_element, id_catalog) and id_catalog
4) ELEMENT: id_element and id_catalog
1) CATALOG: pair(show, status) and id_catalog
2) CATALOG: id_catalog and show and status
Выполнить после выбора:
SELECT DISTINCT `id_element` FROM `ELEMENTS`
WHERE (id_catalog IN (SELECT `id_catalog` FROM `CATALOG` WHERE status=1 AND show = 1)) limit 10
Если есть несколько строк, то это работает очень быстро.Но если он пуст - это займет больше 4 секунд.
В то же время "SELECT
id_catalog FROM
CATALOG WHERE status=1 AND show = 1
" работает быстро, есть строки и пусто.
В таблице ELEMENTS 100 000 записей. В таблице CATALOG 15 000 записей
Также я попытался "присоединиться", но это заняло больше времени, чем раньше.
Почему работает пустой запростак долго, и что я должен сделать, чтобы увеличить скорость?
Вот объясните ответ:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | 'PRIMARY', |'ELEMENTS' | 'index' | '' | null | null | null | 270044 | 'Using where; Using temporary'
2 | 'DEPENDENT SUBQUERY' | 'CATALOG' | 'unique_subquery' | 'PRIMARY,pair,id_catalog' | 'PRIMARY' | '4' | 'func' | 1 | 'Using where'