SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 26.07.2011 17:35:15

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Из-за чего тормозит запрос с limit

есть таблица table, в ней 12 записей, делаю такой запрос:
SELECT * FROM table WHERE `field` = 1  ORDER BY `id` desc LIMIT 0, 10
time: 0.02206

остальные: 0.00100-0.00500.

из-за чего так много?
спасибо

Неактивен

 

#2 26.07.2011 17:37:30

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

Re: Из-за чего тормозит запрос с limit

Создайте составной ключ ALTER TABLE `table` ADD KEY(field,id);

Неактивен

 

#3 26.07.2011 18:03:37

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Re: Из-за чего тормозит запрос с limit

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

Неактивен

 

#4 26.07.2011 18:21:23

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

Re: Из-за чего тормозит запрос с limit

не обязательно отключать, выполняйте SELECT SQL_NO_CACHE ....

Неактивен

 

#5 27.07.2011 02:18:11

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Re: Из-за чего тормозит запрос с limit

хотелось бы отключить всю оптимизацию и кэширование.

Неактивен

 

#6 27.07.2011 10:47:21

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

Re: Из-за чего тормозит запрос с limit

Кэширование (для MyISAM) можно отключить так. В my.cnf прописать:
query_cache_size=0
key_buffer_size=0
и перезапустить mysqld

Неактивен

 

#7 28.07.2011 03:35:20

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Re: Из-за чего тормозит запрос с limit

спасибо еще
таблица blog, в ней 5713 записей, запрос
SELECT COUNT(*) as `num_rows` FROM `blog` WHERE `article_active` = '1'
время: 0.02213

понимаю что конечно таблица не очень маленькая, и это не сервер на нетбук, но все равно многовато.
как можно ускорить запрос?

p.s. ещё есть вариант использовать доп таблицу в которой хранить количество записей, а кроме этого можно как нибудь?
спасибо

p.s.s. может вы знаете как обычно называются такие таблицы?

Отредактированно vvsh (28.07.2011 04:53:21)

Неактивен

 

#8 28.07.2011 11:32:13

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

Re: Из-за чего тормозит запрос с limit

Можно попробовать добавить индекс на `article_active`, а затем считать отдельно count(*) и count(*) WHERE `article_active`=0; Кстати, нужно убрать кавычки вокруг числа 1, иначе лишняя конвертация.

P.S. хранение избыточной информации обычно называется денормализацией БД. В вашем случае можно назвать статистической таблицей.

Неактивен

 

#9 28.07.2011 14:16:56

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Re: Из-за чего тормозит запрос с limit

а если в таблице будет 100 тысяч записей то запрос будет выполнятся достаточно долго, если уже при 5500+ такое время.

Неактивен

 

#10 28.07.2011 14:25:27

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

Re: Из-за чего тормозит запрос с limit

Если неактивных статей мало, то предложенная мной схема будет работать нормально

Неактивен

 

#11 28.07.2011 14:31:31

vvsh
Завсегдатай
Зарегистрирован: 12.01.2008
Сообщений: 50

Re: Из-за чего тормозит запрос с limit

а что в Вашем понятии значит неактивных?

Неактивен

 

#12 28.07.2011 14:38:11

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

Re: Из-за чего тормозит запрос с limit

Если есть индекс на `article_active` и используется MyISAM, то запрос

SELECT COUNT(*) as `num_rows` FROM `blog`;

выполняется мгновенно (по статистике индекса).

Я предполагаю, что `article_active` принимает 2 значения - 0 и 1. При этом значение 0 (неактивная статья) достаточно редко (зачем в блоге неактивные статьи). Значит запрос
SELECT COUNT(*) as `num_rows` FROM `blog` WHERE `article_active` = 0;

выполнится быстро (он обойдет по индексу все неактивные статьи).

Запрос
SELECT COUNT(*) as `num_rows` FROM `blog` WHERE `article_active` = 1;

медленный, так как обойти по индексу почти все статьи менее выгодно, чем обойти полным сканом все записи в таблицы (в итоге индекс не применяется, см. EXPLAIN).

Неактивен

 

Board footer

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