SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.08.2015 17:58:55

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Лимит просмотренных записей

Когда-то попадалась на глаза такая штука, как остановка выборки (SELECT) при достижении Х просмотренных записей. Чё-то никак не удаётся найти как это делается. Неужели мне это приснилось?))

Суть задачи. Есть табличка с большим количеством строк. Т.к. COUNT на большом количестве справляется не быстро, мне достаточно знать, есть ли там Х строк, полное количество можно не считать. Как узнать?

+-----------------+
| COUNT(`id`)  |
+-----------------+
|          499811 |
+-----------------+
1 row in set (2.26 sec)

Готов остановиться на считалке в 20000 smile
Собственно, запрос используется в пагинации, данных вон столько, страница из-за подсчёта количества страниц грузится 3 секунды, хочу ускорить.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 24.08.2015 23:01:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Лимит просмотренных записей

Если запрос хороший (есть индекс по нужным полям), то count должен работать достаточно быстро. 2 секунды - явный перебор. Я бы начал с этого. А вообще кроме limit ничего похожего нету. Можно на explain посмотреть, там будет неплохая оценка количества строк.

Неактивен

 

#3 27.08.2015 22:12:11

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Лимит просмотренных записей

Хм, упорно помню что был где-то такой параметр. Может где-то у перконы попадалось, т.к. с ней работаю.

В общем, с помощью индекса удалось сократить выполнение данного запроса до 0.22 секунды, быстрее никак. Но основной тормоз был всё же не в индексе, а в джоине, который изначально был в этом запросе. С джоином запрос теперь выполняется за 1.4 секунды. Для второй таблицы не используется никаких условий, т.е. просто присоединение и ничего больше. На сколько нормально такое время выполнения в случае с джоином?


+----+-------------+-------+--------+---------------+-------------+---------+----------------------------+--------+-------------+
| id | select_type | table | type   | possible_keys | key         | key_len | ref                        | rows   | Extra       |
+----+-------------+-------+--------+---------------+-------------+---------+----------------------------+--------+-------------+
|  1 | SIMPLE      | p     | ref    | category_id   | category_id | 4       | const                      | 290412 | Using where |
|  1 | SIMPLE      | com   | eq_ref | PRIMARY       | PRIMARY     | 4       | p.last_comment_id |      1 | Using index |
+----+-------------+-------+--------+---------------+-------------+---------+----------------------------+--------+-------------+
 


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 27.08.2015 23:50:39

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

Re: Лимит просмотренных записей

Замедление из-за JOIN абсолютно нормально. Представьте как он выполняется - для каждой строчки нужно заглядывать в другую таблицу.

Неактивен

 

#5 06.12.2015 03:25:27

supermike
Участник
Зарегистрирован: 06.12.2015
Сообщений: 2

Re: Лимит просмотренных записей

Что-то я не очень понимаю, COUNT ведь игнорирует LIMIT команду, т.к. LIMIT ограничивает лишь число возвращаемых строк, но не значение команды COUNT. Разве не так?
В случаях, когда мне необходимо узнать "больше ли 200 записей в выборке", я делаю что-то вроде этого SELECT 1 FROM <...> LIMIT 200. И дальше смотрю есть ли 200 строк или нет. Такой запрос выполняется быстро, если индексы на правильных местах.

Неактивен

 

#6 09.12.2015 18:39:44

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Лимит просмотренных записей

Всё верно. Про LIMIT здесь речи не шло, то в пример привели как "единственный способ ограничения".


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

Board footer

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