LEFT JOIN занимает много времени даже с индексами

У меня есть две таблицы InnoDB. У обоих есть столбец email, который проиндексирован.

Первые таблицы users — это 100 000 записей. Вторая таблица preview_movie составляет 1500 записей.

Я хочу получить все электронные письма, которых нет в таблице users, но которые существуют в таблице preview_movie.

SELECT a.email as email FROM `preview_movie` a  
LEFT JOIN users c on c.email=a.email 
WHERE c.email is NULL

Я пробовал этот вариант и все еще занимает много времени:

SELECT * FROM `preview_movie` a  
WHERE NOT EXISTS
(SELECT email FROM users B WHERE B.email = a.email)

Этот простой запрос выполняется более 70 секунд. Как решить?

Вы пробовали использовать оператор MySQL EXPLAIN? Вероятно, много строк сканирования. Я не сразу вижу сырой первый не будет работать быстро.

Thomas 06.03.2019 20:36

вы видели план запроса по объяснению выбора .... если у вас есть, покажите также результат объяснения

huhushow 06.03.2019 20:36

вы также проверяете кодировку и сопоставление каждого столбца, если они не совпадают, они не могут использовать индекс

huhushow 06.03.2019 20:39

Убедитесь, что у вас есть индексы по электронной почте в обеих таблицах preview_movie и users, и первый запрос должен работать быстро, пока количество пользователей с электронной почтой NULL невелико.

mvp 06.03.2019 20:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
22
0

Другие вопросы по теме