|
|
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Имеется таблица с полями 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. Проблема в том, что в часы пик десятки таких запросов висят минутами в процессах со статусом "Sorting result". MySQL при этом сжирает весь процессор. При профилировании основное время запроса уходит на "Sorting result", достаточно много также на "Sending data". EXPLAIN сообщает следующее: Код: sql 1. 2. Однако иногда бывает так: Код: sql 1. 2. Второй вариант наблюдается всегда, когда не используется 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`". Удаление не проблема, оно делается раз в сутки, ночью, когда сервер без нагрузки. Собственно вопрос, что можно сделать для ускорения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 20:00:28 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Чисто визуально: дано (в порядке индекса field1,field2,datetime):field1field2datetime12112 2 22 1 Код: sql 1. 2. 3. 4. 5. Итог должен быть таким:field1field2datetime121221122Значит, индекс для этого запроса (предположительно) нужен такой: (datetime,field2,field1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 20:44:59 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
невнимательно посмотрел - конечно же (datetime desc , field2, field1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 20:48:17 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Но desc индекс для числовых полей неактуален? Или я чего-то не знаю? В частности запрос ALTER TABLE `table` ADD INDEX `idxX` ( DESC `field` ) создаст индекс для field без ошибок и варнингов, но если сделать дамп структуры таблицы, то индекс там будет обычный, без desc. Вариант с изменением порядка полей в индексе проверю в понедельник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 21:29:13 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Из вашего примера следует то, что для простого индекса возможна выборка в обратном порядке, то есть указание desc несущественно. Для составных индексов (ятд) все же важен порядок сортировки каждого из полей. С другой стороны, требуется всего лишь обратная сортировка по началу индекса - так что может быть и не обязательно указывать desc... Выкладки чисто умозрительные :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 22:06:54 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
http://dev.mysql.com/doc/refman/5.1/en/index-hints.html Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 22:28:12 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
авторСоздан составной индекс field1,field2,datetime BTREE условие WHERE `field1` IN (1,2) AND `field2`=2 покрывает 32281 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2013, 22:29:28 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Cygapb-007 , при создании составного индекса, desc затем также не фигурирует в дампе структуры таблицы, т.е. все выглядит так, как будто desc просто игнорируется. Но, в любом случае, спасибо за идею, я попробую создать индекс в другом порядке и с desc. ScareCrow , как я понимаю, MySQL и сам выбирает индекс именно по datetime, но возможно не всегда, я попробую указывать его принудительно, спасибо за идею. По результатам отпишусь, ну и конечно буду рад новым идеям :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 00:44:58 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
>> ну и конечно буду рад новым идеям :) Если чаше будет выбиратся с ДЕСК, можно сразу сделать поле кверх-тормашками, типа date_desc = - datetime_field (может быть через юникстайм ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 02:40:05 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
ЗАЧЕМ???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 04:35:55 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
ScareCrow, "достор, а поможет? -- ну...будем надеятся не помешает" ТС имеет нестабильность с планами. Вринатов обьяснения и лечения -- несколько. Один из варинатов -- нечеткая работа оптимизатора на сложных индексах с ниспадаюшим порядком. поле-перевертыш сразу убирает потенциальные ошибки такого рода. Для гарантирования использования быстрого плана можно еше поизучать данные и смысл запроса. Так ли нужны обязательно 50? так ли нужны данные за любой промежуток времени? Кардиналити по полям? и.т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 09:04:29 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
чего???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 09:31:40 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
ScareCrowчего???? через плечо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 17:10:25 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
оптимизатор MYSQL тем более на MyISAM простой как лом. никакой "нечеткой работы" у него нет. индексов с "ниспадающим порядком" тоже нет. единственное что есть это перекос данных либо неактуальная статистика. косвенно это подтверждает фраза авторПроблемой также является то, что таблица должна постоянно обновляться, старые данные удаляются, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 20:13:19 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
"Стабильных планов" в MYSQL из за отсутствия кэша этих планов тоже кстати нет. Особенно на InnoDb из за гениальнейшего алгоритма расчета кардинальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 20:17:56 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
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. я не настаиваю что имено в данной ситуации необходим такой подход, но на уровне идее -- вполне сойдет. Пусть ТС сам решает -- проверять или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 22:51:31 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
ScareCrow"Стабильных планов" в MYSQL из за отсутствия кэша этих планов тоже кстати нет. Особенно на InnoDb из за гениальнейшего алгоритма расчета кардинальности. Я имелл ввиду пробовать добится более стабильных планов на "логическом" уровне -- анализом данных и изменением СКЛ. Конечно -- и упомянутая вами статистика -- тоже способ "стабилизировать" план. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2013, 22:56:39 |
|
||
|
Тормоза MySQL, Sorting result
|
|||
|---|---|---|---|
|
#18+
Похоже, что "USE INDEX (datetime)" решило проблему. В общем-то сейчас вижу, что этот вариант был на поверхности, но тогда казалось, что я в полном тупике. Кстати, я пробовал создать индекс по datetime и с DESC и без, но результат был одинаков. Спасибо всем за идеи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2013, 19:49:50 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38377028&tid=1836164]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 350ms |

| 0 / 0 |
