Тестирование MySQL запросов WHERE предложение время поиска - PullRequest
1 голос
/ 05 января 2011

Недавно меня втянули в кабинет начальника и сказали, что один из моих запросов замедляет работу системы.Затем мне сказали, что это потому, что мое предложение WHERE началось с 1 = 1.В моем сценарии я просто добавлял каждое условие поиска к запросу, поэтому я добавил 1 = 1, чтобы я мог просто добавить AND перед каждым поиском.Мне сказали, что это приводит к тому, что запрос выполняет полное сканирование таблицы, прежде чем сузить результаты.

Я решил проверить это.У нас есть таблица user с 14 000 записей.Запросы выполнялись пять раз, используя phpmyadmin и PuTTY.В phpmyadmin я ограничил количество запросов до 500, но в PuTTY ограничений не было.Я пробовал несколько разных базовых запросов и пытался рассчитать их время.Я обнаружил, что 1 = 1, по-видимому, приводит к тому, что запрос выполняется быстрее, чем просто запрос без условия WHERE.Это в реальной базе данных, но, похоже, результаты были довольно последовательными.

Я надеялся опубликовать здесь и посмотреть, может ли кто-нибудь или сломать результаты для меня или объяснить мне логику для любой из сторон этого.alt text

Ответы [ 3 ]

2 голосов
/ 05 января 2011

Ну, ваш начальник и его источник информации - идиоты.Добавление 1=1 к запросу не вызывает полное сканирование таблицы.Единственное, что он делает, это заставляет разбор запросов занимать крошечную сумму дольше.Любой приличный генератор плана запроса (включая mysql) поймет, что это условие NOP, и отбросит его.

Я пробовал это на своей собственной базе данных (исторические данные панели солнечных батарей), ничего интересного из шума.

mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01';
seconds: 5.73, 5.54, 5.65, 5.95, 5.49
mysql> select sum(KWHTODAY) from Samples where Timestamp >= '2010-01-01' and 1=1;
seconds: 6.01, 5.74, 5.83, 5.51, 5.83

Примечание. Я использовал отключение кэша запросов ajreal.

1 голос
/ 05 января 2011

Это не совсем точный способ определить, что происходит внутри MySQL. Такие вещи, как кеширование и изменения в сети, могут исказить ваши результаты.

Вы должны использовать «объяснение», чтобы выяснить, какой план запросов использует MySQL для ваших запросов с 1 и 1 и без него. Администратор базы данных будет более заинтересован в этих результатах. Кроме того, если ваше 1 = 1 вызывает полное сканирование таблицы, вы будете знать наверняка.

Синтаксис объяснения здесь: http://dev.mysql.com/doc/refman/5.0/en/explain.html

Как интерпретировать результаты здесь: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

1 голос
/ 05 января 2011

Во-первых, вы set session query_cache_type=off; во время обоих испытаний?

Во-вторых, ваши тестовые запросы на PHPmyadmin и Putty (клиент mysql) настолько различны, как проверить?
Вы должны подать один и тот же запрос на оба сайта.

Кроме того, вы не можете предполагать, что PHPmyadmin отключил кеш запросов. Отображение времени на phpmyadmin включает обработку PHP, чего также следует избегать.

Поэтому вам следует просто выполнить тестирование на клиенте mysql.

...