Выберите счетчик против производительности оператора выбора, когда запрос вернет 0 строк - PullRequest
1 голос
/ 06 августа 2020

Я просматриваю код, который написал старый разработчик, которого уже нет. Я нашел кое-что, что, я не совсем уверен, имеет смысл делать, но я не думаю, что у меня достаточно знаний или достаточно хорошего гугл-фу, чтобы найти ответ, так что вот:

Код выглядит так: это:

var queryCount = SELECT COUNT(Col1) FROM MyTable WHERE ColumnInIndex = 'SomeValue'

if(queryCount == 0)
   return [];

var results = SELECT Col1, Col2, Col3,... FROM MyTable WHERE ColumnInIndex = 'SomeValue'
return results;

Итак, моей первой мыслью было то, что кажется избыточным и в первую очередь нужно просто использовать результаты запроса select. Я копал немного дальше, потому что коммит предлагает его для настройки производительности.

Из того, что я понял из поиска в Google, на самом деле count будет быстрее, потому что ему не нужно возвращать какие-либо данные или извлекать какие-либо строки и может полагаться исключительно на индекс.

Однако в псевдокоде, который я написал выше, случай, когда предложение where не возвращает ни одной строки, кажется, что мы не получим повышения производительности, потому что ни один ни select не вернет никаких результатов. Кроме того, когда на самом деле есть результаты, мы выполняем два из этих запросов вместо одного.

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

Я здесь совсем не в базе?

Мы используем MySql v5.6.46

1 Ответ

1 голос
/ 06 августа 2020

Вы правы. [Но читайте до конца!]

Два шага неэффективно - в любой версии MySQL. Если строк нет, Оптимизатор выполнит практически такой же объем работы для SELECT.

Если есть несколько строк, то первая SELECT будет пустой тратой времени. См. Программную аббревиатуру «KISS».

Псевдокод подразумевает, что «return» является пустым массивом; Я предполагаю, что это справедливо для любого запроса, когда нет соответствующей строки?

Примечание: я надеюсь, что ColumnInIndex означает «столбец, который первый в каком-то индексе». Если столбец не первый, ни один из запросов не будет использовать индекс. (Этот комментарий не влияет на основной вопрос.)

Другое примечание (направленное на PTank): когда нет совпадающих строк, ни одна из этих

SELECT col FROM ... WHERE ...
SELECT  *  FROM ... WHERE ...

не возвращает никаких строк; они не возвращают NULL для столбца (ей). (Использование * «плохо» по множеству причин, не связанных с исходным Вопросом.)

О, еще один комментарий. COUNT(col) проверяет col на непустое значение перед подсчетом строки. COUNT(*) просто считает строки. Практически во всех случаях следует использовать COUNT(*); это проще, быстрее и, вероятно, дает тот же ответ. (Ответ будет таким же, если col - это PRIMARY KEY.)

Добрый день !! Это означает, что ваш первый запрос не избыточен! Случай нечетного шара - это когда col1 равно NULL в каждой строке. Первый запрос вернет нулевое количество, но второй запрос вернет несколько строк (с первым столбцом NULL).

Это был вопрос с подвохом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...