- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте
Есть такой запрос
Запрос выводит информацию для текущей страницы
Для постраничной навигации нужно узнать сколько всего будет строчек возвращать запрос без LIMIT
про mysql_num_rows - знаю, не выход
нужен оптимизированный запрос
Без Group By всегда пользовался count(*), но в данном случае возвращает не общее количество а сумму по группам
KOSMOS aka Anarion, как-то не очень понятно. В данном случаем COUNT(*) вкупе с GROUP BY вернёт вам именно то число строк, которое вам выдаст MySQL при обычном запросе. Если же вам нужна общая сумма строк подпадающих под данное условие во WHERE, то просто не используйте GROUP BY. Но тогда я уже не очень понимаю, как вы вообще у себя потом всё это собираете и реализуете постраничную листалку, если в одном случае вам нужно одно, в другом - другое.
SQL_CALC_FOUND_ROWS вам в помощь
[umka] добавил 28.09.2010 в 00:26
$q=mysql_query("SELECT SQL_CALC_FOUND_ROWS field1, field2, ... FROM table WHERE ... LIMIT ...");
$count=0+@mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0); // общее количество страниц, попавших под условие WHERE
Далее разбираем результат $q любым привычным способом.
;7688679']SQL_CALC_FOUND_ROWS вам в помощь
[umka] добавил 28.09.2010 в 00:26
$q=mysql_query("SELECT SQL_CALC_FOUND_ROWS field1, field2, ... FROM table WHERE ... LIMIT ...");
$count=0+@mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0); // общее количество страниц, попавших под условие WHERE
Далее разбираем результат $q любым привычным способом.
Спасибо, именно то, что было нужно.
Не используйте никогда SQL_CALC_FOUND_ROWS (убивает использование индексов). Лучше 2 запроса - один на выборку, второй - на подсчет результатов
и есть самый оптимальный вариант.
А вообще не совсем понятно. Если вы исполняете запрос
,то посчитать кол-во строк не составит труда в PHP (насколько я понял), верно?
И собак (@) в PHP не используйте никогда - сжирает дополнительно время + ошибки отлавливать сложней становится.
Написал только что специально для вас :)
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.10546708107
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.021900177
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.05678701401
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.03543806076
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = @print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.51796078682
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = @print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.50326180458
nemoden@Megacomp:/proc$ php -r '$s=microtime(true); for($i=0;$i<1000000;$i++) { $ar = array(1,2,3); $e = @print_r($arr, 1); } echo PHP_EOL.(microtime(true) - $s).PHP_EOL;'
1.46839904785
красным зло выделено.
благодаря всего одной собаке этот супер сложный скрипт выполняется в полтора раза дольше, чем мог бы.
[umka], что же вы 3-мя строчками 2-м плохим вещам человека научили?
Не используйте никогда SQL_CALC_FOUND_ROWS (убивает использование индексов).
С какого перепугу?
Всё используется.
Ссылка на документацию, в которой SQL_CALC_FOUND_ROWS рекомендуется именно для таких случаев:
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
А вообще не совсем понятно. Если вы исполняете запрос
,
то посчитать кол-во строк не составит труда в PHP (насколько я понял), верно?
Нет. Функция mysql_num_rows() вернёт лишь количество строк в результате, но не общее количество строк, участвовавших в группировании.
То же самое, если используется LIMIT.
И собак (@) в PHP не используйте никогда - сжирает дополнительно время + ошибки отлавливать сложней становится.
Сжирает времени не больше чем дискового пространства :)
Время тратится разве что на парсинг и переключение флагов. Разница становится существенна только при таких масштабах, как у вас (1000000 операций). Столько собак на всех сайтах на сервере не найдётся.
А способ обработки ошибок — дело каждого. Конкретно в данном случае (в моём примере) считаю собаку уместной :)
Если Engine=InnoDB и указан лимит, всё хорошо, но если у вас MyISAM (а его чаще всего нужно использовать для больших таблиц логов), то индекс не используется. Часто это может привести к тому, что у вас запросы будут выполняться в десятки раз дольше.
Собаки, я считаю, плохой стиль программирования, ну да бог с ним, но вот sql_calc_found_rows - pure evil! У нас один программист очень любил sql_calc_found_rows... Пришлось во многих случаях избавляться от нее, потому что она не добавляет никакого перворманса, а во многих случаях является, как говорится "performance pig"-ом
Сами потестируйте на таблицах с более миллиона записей и еще вот это можете почитать http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
PS я наврал только в одном - не всегда конечно sql_calc_found_rows убивает использование индексов.
Да. Тут я невнимательно прочитал то, что ТС-у нужно. В любом случае, я не советую использовать sql_calc_found_rows - от него неприятно избавляться, а ссылка ваша не рекомендация, а просто описание, что так можно делать. Ничего об улучшении performance там не сказано.
sql_calc_found_rows так скажем нужно использовать в отдельных случаях
если count(*) используется по индексу, а потом еще и запрос по индексу с LIMIT, то оно быстрее будет, чем sql_calc_found_rows, который реально будет по всем записям проходиться.
а вот, если без индекса, типо какой-нибудь поиск по некоторым полям, когда в любом случае будет проходить по всем записям, то тут уж лучше с sql_calc_found_rows, чтобы два раза по таблице не проходить
тс, по-моему аналогично будет запрос SELECT count(*) FROM table WHERE ..., т.е. без group
а тут уже смотреть что быстрее будет, с SQL_CALC_FOUND_ROWS или с таким count(*)