Нужен совет по ускорению этого запроса MySQL - PullRequest
0 голосов
/ 13 июня 2011

Это запрос, который я сейчас выполняю:

SELECT * FROM `datalog`
WHERE world_id IN (2) 
AND action IN (0,1,2,8,9,10,11,13,14,15)
AND x = -184.0 AND y = 98.0 AND z = 141.0
ORDER BY data_id DESC;

К сожалению, это занимает много времени и не знаю почему (5 секунд или более с 14 миллионами записей в базе данных).У меня есть индекс на world_id и action (так как есть только максимум 7 миров и 20 action).Как еще можно ускорить поиск?

РЕДАКТИРОВАТЬ - значение объяснения: ПРОСТОЙ справочник данных ВСЕ NULL NULL NULL NULL 13510263 Использование где;Использование файловой сортировки

Ответы [ 5 ]

1 голос
/ 13 июня 2011

Попробуйте добавить индексы к x, y и z.

Вы сказали, что думали, что это не будет работать, поскольку они могут содержать большой диапазон значений.

Пока вы это делаетеиспользуя тип таблицы, который поддерживает индексы BTREE (это единственный тип индекса, поддерживаемый MyISAM и INNODB), это не должно быть истиной.Если вы используете индекс HASH, это может иметь место, так как ему нужно будет индексировать каждое значение.Но с индексом BTREE MySQL может быстро сортировать по определенному значению в индексе.Вот почему он может использовать BTREE индексы и для запросов с операторами сравнения (<, > и т. Д.)

Вы можете увидеть больше здесь: http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html

0 голосов
/ 13 июня 2011

Я бы попробовал составной индекс: (actionid, worldid).

0 голосов
/ 13 июня 2011

Не знаю, сработает ли это, но вы пытались изменить ваши условия? x = -184.0 скорее всего будет быстрее, чем действие в (...). Если MySQL использует короткое замыкание, это может ускорить его.

0 голосов
/ 13 июня 2011

В дополнение к тому, что сказал @patapizza, вы должны использовать IN () только в том случае, если у вас есть случайные вещи для поиска, поэтому: world_id = 2 и action < 16, вероятно, помогут.на другие столбцы вы ссылаетесь в операторе WHERE и, вероятно, также на data_id.Как сказал @AJ, опубликуйте вывод EXPLAIN, и можно точно определить, почему он медленный.

0 голосов
/ 13 июня 2011

Вы можете попробовать заменить ваше условие в поле действия на AND action < 16?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...