powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Тормоза MySQL, Sorting result
18 сообщений из 18, страница 1 из 1
Тормоза MySQL, Sorting result
    #38376641
peter23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Имеется таблица с полями id,datetime,field1,field2 и еще ряд полей с данными.
id - unsigned int, auto_increment, PRIMARY key
datetime - int
field1 - smallint
field2 - smallint
Создан составной индекс field1,field2,datetime BTREE. Также есть индекс datetime, тоже BTREE.

Делаю запрос
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `table`
WHERE `field1` IN (1,2)
AND `field2`=2
ORDER BY `datetime` DESC
LIMIT 0,50



Проблема в том, что в часы пик десятки таких запросов висят минутами в процессах со статусом "Sorting result". MySQL при этом сжирает весь процессор.
При профилировании основное время запроса уходит на "Sorting result", достаточно много также на "Sending data".
EXPLAIN сообщает следующее:
Код: sql
1.
2.
id 	select_type 	table 	type 	possible_keys 		key 		key_len 	ref 	rows 	Extra
1 	SIMPLE 		table 	range 	field1_field2_datetime 	datetime 	4 		NULL 	198 	Using where


Однако иногда бывает так:
Код: sql
1.
2.
id 	select_type 	table 	type 	possible_keys 		key 			key_len 	ref 	rows 	Extra
1 	SIMPLE 		table 	range 	field1_field2_datetime 	field1_field2_datetime 	4 		NULL 	32281 	Using where; Using filesort


Второй вариант наблюдается всегда, когда не используется LIMIT, но по-моему и с LIMIT иногда бывает так.

В таблице порядка 130 тыс. строк. MyISAM.
MySQL версии 5.5.21. Windows Server 2008. VDS от 1GB, максимальный тариф (4096 МБ памяти, 4 ядра по 2 ГГц).
Настройки уже покрутил, все буферы выставлены в достаточно большие значения.

Сейчас посмотрел, время работы около 2 суток, число запросов 22М, т.е. в среднем 125 в секунду. Но запросы в основном идут только в рабочие дни, причем лишь порядка 12-14 часов в сутки, т.е. в часы пик скорость могла быть около 300 запросов в секунду. Странно, но по процессам я вроде бы такого количества не наблюдаю, проверю в понедельник. Однако, если статистика не ошибается, то может быть для такой нагрузки уже недостаточно этого железа?

Проблемой также является то, что таблица должна постоянно обновляться, старые данные удаляются, новые добавляются, поэтому кэширование неэффективно, однако кэш включен. Я уже сделал промежуточную таблицу, в которую складываю данные, а затем раз в 10 минут переношу их в основную таблицу запросом "INSERT INTO `table` SELECT * FROM `table_buf`". Удаление не проблема, оно делается раз в сутки, ночью, когда сервер без нагрузки.

Собственно вопрос, что можно сделать для ускорения?
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376659
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чисто визуально: дано (в порядке индекса field1,field2,datetime):field1field2datetime12112 2 22 1
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `table`
WHERE `field1` IN (1,2)
AND `field2`=2
ORDER BY `datetime` DESC
LIMIT 0,50

Итог должен быть таким:field1field2datetime121221122Значит, индекс для этого запроса (предположительно) нужен такой: (datetime,field2,field1)
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376663
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
невнимательно посмотрел - конечно же (datetime desc , field2, field1)
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376680
peter23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но desc индекс для числовых полей неактуален? Или я чего-то не знаю?
В частности запрос
ALTER TABLE `table` ADD INDEX `idxX` ( DESC `field` )
создаст индекс для field без ошибок и варнингов, но если сделать дамп структуры таблицы, то индекс там будет обычный, без desc.

Вариант с изменением порядка полей в индексе проверю в понедельник.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376694
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из вашего примера следует то, что для простого индекса возможна выборка в обратном порядке, то есть указание desc несущественно.

Для составных индексов (ятд) все же важен порядок сортировки каждого из полей.

С другой стороны, требуется всего лишь обратная сортировка по началу индекса - так что может быть и не обязательно указывать desc... Выкладки чисто умозрительные :)
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376702
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `table` USE INDEX (datetime)
WHERE `field1` IN (1,2)
AND `field2`=2
ORDER BY `datetime` DESC
LIMIT 0,50
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376704
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСоздан составной индекс field1,field2,datetime BTREE

условие WHERE `field1` IN (1,2)
AND `field2`=2

покрывает 32281 строк.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376745
peter23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 , при создании составного индекса, desc затем также не фигурирует в дампе структуры таблицы, т.е. все выглядит так, как будто desc просто игнорируется. Но, в любом случае, спасибо за идею, я попробую создать индекс в другом порядке и с desc.

ScareCrow , как я понимаю, MySQL и сам выбирает индекс именно по datetime, но возможно не всегда, я попробую указывать его принудительно, спасибо за идею.

По результатам отпишусь, ну и конечно буду рад новым идеям :)
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376758
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> ну и конечно буду рад новым идеям :)

Если чаше будет выбиратся с ДЕСК, можно сразу сделать поле
кверх-тормашками, типа
date_desc = - datetime_field
(может быть через юникстайм )
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376768
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗАЧЕМ????
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376794
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

"достор, а поможет? -- ну...будем надеятся не помешает"

ТС имеет нестабильность с планами.
Вринатов обьяснения и лечения -- несколько.
Один из варинатов -- нечеткая работа оптимизатора на
сложных индексах с ниспадаюшим порядком.
поле-перевертыш сразу убирает потенциальные ошибки
такого рода.

Для гарантирования использования быстрого плана
можно еше поизучать данные и смысл запроса.
Так ли нужны обязательно 50? так ли нужны
данные за любой промежуток времени?
Кардиналити по полям? и.т.д.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376802
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего????
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376946
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowчего????

через плечо.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376986
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оптимизатор MYSQL тем более на MyISAM простой как лом. никакой "нечеткой работы" у него нет. индексов с "ниспадающим порядком" тоже нет.

единственное что есть это перекос данных либо неактуальная статистика.
косвенно это подтверждает фраза
авторПроблемой также является то, что таблица должна постоянно обновляться, старые данные удаляются,
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38376987
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Стабильных планов" в MYSQL из за отсутствия кэша этих планов тоже кстати нет. Особенно на InnoDb из за гениальнейшего алгоритма расчета кардинальности.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38377027
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowоптимизатор MYSQL тем более на MyISAM простой как лом. никакой "нечеткой работы" у него нет. индексов с "ниспадающим порядком" тоже нет.

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

В интернете есть упоминание про колонки-перевертыши.
Например:
http://www.mysqlperformanceblog.com/2006/05/09/descending-indexing-and-loose-index-scan/

авторSo when do you really need Descending indexes ? Most typical case is when you want to order by two colums in different directions: … ORDER BY price ASC, date DESC LIMIT 10 If you have indexed on (price,date) in ascending order you will not be able to optimize this query well – external sort (“filesort”) will be needed. If you would be able to build index on price ASC, date DESC the same query could retrive data in aready sorted order.

This is however something you can workaround by having something like “reverse_date” column and using it for sort. With MySQL 5.0 you even can use triggers to update it as real date updates so it becomes less ugly. In fact this is for example why you would see “reverse_timestamp” field in Wikipedia table structure.

я не настаиваю что имено в данной ситуации необходим
такой подход, но на уровне идее -- вполне сойдет.
Пусть ТС сам решает -- проверять или нет.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38377028
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow"Стабильных планов" в MYSQL из за отсутствия кэша этих планов тоже кстати нет. Особенно на InnoDb из за гениальнейшего алгоритма расчета кардинальности.

Я имелл ввиду пробовать добится более стабильных планов на
"логическом" уровне -- анализом данных и
изменением СКЛ.

Конечно -- и упомянутая вами статистика --
тоже способ "стабилизировать" план.
...
Рейтинг: 0 / 0
Тормоза MySQL, Sorting result
    #38380321
peter23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, что "USE INDEX (datetime)" решило проблему. В общем-то сейчас вижу, что этот вариант был на поверхности, но тогда казалось, что я в полном тупике.
Кстати, я пробовал создать индекс по datetime и с DESC и без, но результат был одинаков.
Спасибо всем за идеи.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Тормоза MySQL, Sorting result
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]