Быстрый запрос выбора для нескольких первичных ключей - PullRequest
0 голосов
/ 12 октября 2018

При тестировании моей простой почтовой MySQL базы данных я обнаружил странное поведение и был бы рад узнать, почему.

Моя таблица 'mail' имеет два первичных ключа:

idx : INT(Auto-Increment)
uid : VARCHAR(50)

снекоторые другие фиктивные столбцы, такие как созданный время, информация и т. д.

Затем я заполнил свою таблицу 200 000 фиктивных данных и проверил ее с помощью простого поискового запроса:

SELECT * FROM mail WHERE uid='RANDOMGENERATEDUID';

Потребовалось околоЗа 0,235 секунды для выполнения этого запроса и из табличного объяснения рабочей среды я обнаружил, что этот запрос выполняет сканирование полной таблицы и не использует ключей.

Мне было любопытно, что произойдет, если I force использовать столбец 'idx' для запроса SELECT, поэтому я протестировал другой запрос, который будет иметь тот же результат:

SELECT * FROM mail
WHERE idx IN (SELECT idx FROM foodwagondb.mail WHERE uid='RANDOMGENERATEDUID');

Но меня удивило то, что этот запрос выполняется намного быстрее, 0,078Секунду, чтобы выполнить!

Что здесь происходит у меня на глазах?Я был бы рад узнать, почему это происходит!

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

В вашем первом запросе вы ищите каждую строку на основе поля varchar (uid).Во втором запросе mysql предварительно фильтрует строки на основе индексированного поля (idx), а затем ищет в этом подмножестве текстовую строку.Для небольших таблиц вы не увидите разницы, но для больших таблиц это имеет снижение производительности.И @scaisEdge прав, правила ВНУТРЕННЕГО СОЕДИНЕНИЯ!

0 голосов
/ 12 октября 2018

Вы должны избегать предложения IN и использовать вместо него INNER JOIN

SELECT m1.* FROM mail m1
INNER JOIN foodwagondb.mail m2 ON m2.idx = m1.idx 
WHERE idx m2.uid='RANDOMGENERATEDUID';

предложение IN эквивалентно условию ИЛИ; это означает, что связанный запрос повторяется для каждого значения ...Внутреннее объединение выполняет только запрос и сопоставляет полученные значения.

В любом случае вы можете улучшить оба запроса, используя правильный составной индекс для uid до

create index my_index on mail (uid, idx)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...