sarkisssik
@sarkisssik

Select count — ускорить или избавиться?

Доброго времени.
Есть стандартная постраничная навигация
$db_query="select count(*)
   from ".DB_PREF."advert advert "
   ." where "
   ." advert.hide='show' "
   ." and advert.end_putdate > ".$GLOBALS["timeDayAdvert"]."   "
   .$params
   .$this->add_db_query_country().$this->add_db_query_region().$this->add_db_query_city();


$db_query="
		select *
	." from ".DB_PREF."advert advert where"
       ." advert.hide='show' "
       ." and advert.end_putdate > ".$GLOBALS["timeDayAdvert"]."   "
       .$params
       .$this->add_db_query_country().$this->add_db_query_region().$this->add_db_query_city()
       ." order by "
       .( $this->name_sort ? " ".$init_sort_doska[$this->name_sort]." ".$this->type_sort." " :  " advert.premium_adv DESC, advert.sort_time DESC ")
       ." limit ".($this->open_num_page_all_advert-1)*KOL_ADVERT_TO_ALL_PAGE." , ".KOL_ADVERT_TO_ALL_PAGE;


Тут все стандартно. Подсчет всех записей и выборка для разбиения .

в базе много записей (~800 тыс) - Время генерации страницы :
- с индексами - 3-5 секунды
- без индексов - 15-20 секунд

Хотел бы спросить , как все-таки решить проблему с select count , т.к она сильно нагружает ?
Предложили:
1. сделать в базе отдельно счетчик записей . Но так и не понял, для чего , если у меня всякие фильтры можно использовать.
2. нашел такой вариант , но так и не осмыслил его, как его реализовать. Цитата:

В таблице 700000 записей, нам нужно вывести десятую страницу с 10 записями с постраничной навигацией: выбираем не 10, а 41 запись (не забываем про офсет), выводим 10, но благодаря тому, что выбралась 31 запись вперед, мы знаем что еще есть как минимум 4 страницы на которые можно отобразить ссылки.


Может еще какие советы подкинете ? спасибо !
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку

в базе много записей (~800 тыс) - Время генерации страницы :
- с индексами - 3-5 секунды

так себе у вас индексы.
800к записей совсем ничего для mysql.

1. Вообще не вариант.
2. все же понятно описано. Выбираете с запасом и считаете сколько выбралось, когда запаса не остается значит больше записей нет.
Ответ написан
@mistergonza
PHP6 evangelist
У вас только count медленный?

И втором запросе измените
SELECT *

На
SELECT id
И получив список id, отдельным запросом получайте записи по id.

Либо через join по id сделайте:
SELECT * FROM table JOIN (SELECT id FROM table LIMIT 10000, 10);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы