2015-10-09 4 views
1

Я пытаюсь выбрать ряд элементов из table1, которые не указаны в table2. Таблица 1 имеет приблизительно 3 миллиона строк, а Таблица 2 имеет приблизительно 8 000. У меня уже есть индекс на table1 for (expire, ненадежный, блок, удаленный, флаг, expirationDate). Как оптимизировать это:Как оптимизировать левую ссылку на большой стол

SELECT table1.* 
FROM table1 
LEFT JOIN table2 
ON table1.item_ID = table2.item_ID 
WHERE table1.expire = '0' 
AND table1.unreliable = '0' 
AND table1.block = '0' 
AND table1.deleted = '0' 
AND table1.flag = '0' 
AND table1.expirationDate >= CURDATE() 
AND table2.item_ID IS NULL 
GROUP BY item_ID 
LIMIT 5000 

ответ

2

Добавить дополнительный индекс table2.item_id. Эти индексы важны для оптимизации LEFT JOIN.

Представьте, что у вас есть две разные телефонные книги. Вы ищете для всех Люди, начинающиеся с «T» (часть WHERE) в книге A. Это довольно быстро, потому что у вас есть индекс. Но для каждого номера телефона вы должны сканировать всю книгу B, пытаясь найти там тот же номер телефона. Используя индекс (отсортированный список всех номеров телефонов в книге B), это намного быстрее ...

+0

Но не должны ли эти индексы существовать, поскольку item_ID является первичным ключом в обеих таблицах? – user2694306

+0

Вы не сказали 'item_ID', вы первичный ключ. Я не уверен, что mysql автоматически создает индекс для первичных ключей. Я считаю, что это не так. Вы можете просто проверить это с помощью 'SHOW INDEX'. Если он не показывает такой индекс, его не существует. –

+1

Ах, ты был прав, это был не первичный ключ во второй таблице. Теперь это работает хорошо. Благодаря! – user2694306

Смежные вопросы