SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 07.12.2013 03:40:09

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

paulus написал:

Вариант по умолчанию должен, разумеется, не считать count вообще.

Так и есть.

paulus написал:

Сигнализировать о том, как считать количество, можно в том же параметре, который передает количество
строк, которое нужно передать.

Это не совсем удобно. Почему - расскажу как-нибудь потом.

paulus написал:

Ну то есть я, если честно, не понимаю, почему мы это
обсуждаем на форуме о MySQL

Ну, Вася спросил, зачем мне это нужно, я и рассказал smile

paulus написал:

Миш, ты пишешь ORM, возьми готовый какой-то.

Я пытался, но понял, что не написать свой я не могу smile
Да и вообще-то поздно отговаривать, т.к. я его уже написал, он работает smile. Осталось подготовить к нему пояснительную статью, чем сейчас и занимаюсь.

Неактивен

 

#27 07.12.2013 11:23:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

Я бы не использовал SQL_CALC_FOUND_ROWS вообще никогда. Дело в том, ситуации, когда с ним нет проблем - это ситуации, когда не нужна оптимизация, то есть запрос быстрый изначально. Если запрос тяжелый, то как уже подробно объяснил paulus, запрос с SQL_СALC будет медленнее двух запросов (нужно помнить, что если есть ORDER BY, то SQL_CALC почти гарантирует неоптимизируемый filesort). Нагружать юзера выбором опции не стоит - пусть потратит свое внимание на другие важные детали - трудно представить себе ситуацию, когда он захочет установить SQL_CALC - это может быть только, если два запроса будут работать медленно, но тогда SQL_CALC не поможет.

Неактивен

 

#28 08.12.2013 09:07:03

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

Убедили smile
Делаем COUNT(*) по умолчанию.

Маленький вопросик: бывает ли смысл внутри COUNT что-то вместо звездочки писать в данном случае?

Неактивен

 

#29 08.12.2013 10:23:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

Нет.

count(что-то) - это подсчет сколько раз это что-то не является null.

count(*) - в этом случае сервер знает, что выражение внутри скобок не может быть null. Здесь * это не аналог полного списка столбцов, они вообще игнорируются, а считаются только сами строки.

Неактивен

 

#30 31.12.2013 00:32:44

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

paulus написал:

Миш, ты пишешь ORM, возьми готовый какой-то.

Я пытался, но понял, что не написать свой я не могу smile
Да и вообще-то поздно отговаривать, т.к. я его уже написал, он работает smile. Осталось подготовить к нему пояснительную статью, чем сейчас и занимаюсь.

Опубликовал статью: http://webew.ru/articles/5096.webew

Всех с наступающим!

Неактивен

 

#31 02.06.2019 14:11:55

galicin
Участник
Зарегистрирован: 02.06.2019
Сообщений: 1

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

Мой ответ хоть и на старый пост, но думаю поможет определиться и другим посетителям в будущем использовать "SQL_CALC_FOUND_ROWS" или "count(*)".
Вот ответ техподдержки одного из хостинг-провайдеров по поводу нагрузки на CPU процессом mysqld:
"Высокую нагрузку на сервер создавали запросы к базе данных вашего сайта:
SELECT SQL_CALC_FOUND_ROWS p.`virtuemart_product_id` FROM `#_virtuemart_products`
Для исправления этой проблемы следует оптимизировать запросы к базе в скриптах сайта и хранение данных в самой базе, а также проставить индексы на часто используемые поля. Для этого следует обратиться к разработчику вашего сайта, либо к сторонним веб-специалистам."
Подобные ответы получал неоднократно на разных сайтах и хостингах.
Таким образом, можно говорить о крайней нежелательности использования в запросах "SQL_CALC_FOUND_ROWS".

Неактивен

 

#32 27.11.2021 13:07:30

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: Влияет ли SQL_CALC_FOUND_ROWS на производительность запросов?

Все-таки есть случаи, когда SQL_CALC_FOUND_ROWS быстрее двух запросов.

Это сложные запросы с группировкой и сортировкой/HAVING по неиндексированным колонкам или вообще выражениям, вычисляемым на ходу. Например:

Код:

SELECT a.id
FROM a
JOIN b ON b.a_id = a.id
GROUP BY a.id
HAVING SUM(b.x * b.y) > 1000
ORDER BY SUM(b.x * b.y) DESC
LIMIT 1

Чтобы отдать часть записей, серверу все равно нужно перелопатить весь запрос, поэтому SQL_CALC_FOUND_ROWS его не замедлит. А вот второй запрос с COUNT(*) будет выполняться столько же, сколько первый, что даст замедление в два раза.

Однако если все-таки ставить вопрос ребром: или COUNT(*), или SQL_CALC_FOUND_ROWS, не глядя на запрос, то выбор по-прежнему за COUNT(*). И вот почему.
Медленный запрос с COUNT(*) станет в два раза медленее. Но это не страшно. Потому что он итак медленный.
Быстрый же запрос с SQL_CALC_FOUND_ROWS может стать скачкообразно медленнее. Не в два раза, а в десятки раз. И вот это плохо. Потому что тогда вместо медленных запросов, которые стали в два раза медленнее, и запросов быстрых мы получим исходные медленные и еще одни медленные, в которые превратились быстрые.

В общем, я примерно повторил то, что ранее писал Гриша smile

rgbeast написал:

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson