2014-09-20 2 views
0

У меня есть таблица, содержащая не менее 60 000 строк. Мой запрос только основной, и это что-то вроде этого:Slow Sql Execution

SELECT `table`.name, `table`.age, `table`.points 
           FROM table 
           GROUP BY name, age 
           ORDER BY date 
           DESC 
           LIMIT 12 

В результате, как (12 Всего запросов занял 1.2211 сек), иногда даже занимает 2 секунды, чтобы просто вернуть 12 строк.

Что нужно сделать, чтобы сделать мой запрос быстрее?

EXPLAIN QUERY:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
1  Extra  table ALL  NULL   NULL NULL  NULL 65704 Using temporary; Using filesort 
+0

Если у вас есть проблемы с производительностью, позвоните MySQL [EXPLAIN] (http://dev.mysql.com/doc/refman/5.6/en/explain.html), какая работа должна быть выполнена. И как @SteelBrain отметил: индексы отлично подходят для улучшения производительности во многих случаях. Пожалуйста, добавьте вывод EXPLAIN и оператора CREATE TABLE вашей таблицы. – VMai

+0

И удалите ORDER BY, это не имеет никакого смысла с этим утверждением. – VMai

+0

Обратите внимание, что значение в столбце 'points' не является самым новым для каждой группы. Это неопределенный. Пожалуйста, прочитайте [Расширения MySQL для GROUP BY] (http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html). Если вы не можете использовать агрегированную функцию в точках, вы можете использовать подзапрос или левое соединение. – VMai

ответ

0

Вы можете создавать индексы в базе данных SQL. Если вы используете MYSQL вы можете создать их как этот

ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME); 

Для вашего случая это было бы как:

ALTER TABLE `table` ADD INDEX (name); 
ALTER TABLE `table` ADD INDEX (age); 
ALTER TABLE `table` ADD INDEX (points); 

Вы также можете захотеть взглянуть на this question

+0

Комбинированный индекс (имя, возраст), вероятно, будет хорошей идеей. – VMai

+0

будет ли объединенный индекс 'name and age' работать, если пользователь ищет только по имени или только по возрасту? –

+0

Он будет работать, если искать только по названию, но не только по возрасту. Здесь у нас есть комбинация обоих столбцов, поэтому она может помочь. – VMai

1

Этом слишком длинный для комментария. Индекс на дату поможет, без него он будет вынужден выполнять сканирование таблицы. . Какова мощность имени, то есть количество отдельных имен, разделенное на количество строк? В случае, если оно мало, вы можете создать таблицу с этими разными именами и JOIN на этом, стремясь к свободному сканированию индекса. Для начала попробуйте составленный индекс:

ALTER TABLE t1 ADD KEY indexName (name,age,date) 

Для получения более подробной информации положить EXPLAIN до вашего запроса и редактировать вопрос с результатами.