2013-12-07 4 views
3

Я бегу запрос (с 3 минуты, чтобы выполнить) -Как избежать временной таблицы в sql-запросе?

SELECT c.eveDate,c.hour,SUM(c.dataVolumeDownLink)+SUM(c.dataVolumeUpLink) 
FROM cdr c 
WHERE c.evedate>='2013-10-19' 
GROUP BY c.hour; 

с объяснить план -

id select_type table type possible_keys     key key_len ref rows  Extra           
1 SIMPLE  c  ALL evedate_index,eve_hour_index      31200000 Using where; Using temporary; Using filesort 

Я использую таблицу (MyISAM) -

Первичный ключ (id, evedate),

с еженедельными 8 перегородками с ключом,

индекс key-on evedate,

Составной указатель на evedate, час.

Я изменил параметры настройки MySQL из my.ini как (4 Гб RAM) -

tmp_table_size = 200M

key_buffer_size = 400M

read_rnd_buffer_size = 2М

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

EDIT:После добавления нового составного индекса (evedate, MSISDN)

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

спасибо.

+3

ОТ: http://www.mysqlperformanceblog.com/2009/03/05/what-does-using-filesort-mean-in-mysql/ В любое время сортировка не может быть выполнена из индекса, это файловый центр. Он не имеет ничего общего с файлами. Filesort следует называть «сортировкой». Он быстро сортируется в глубине души. – Damodaran

+0

, но как насчет временного файла? Я слышал, что временный файл вызывает медленный запрос, мой предыдущий запрос занимает 4 минуты. – Aamir

+0

создать ссылку sqlfiddle с образцом данных. – Damodaran

ответ

1

Вы ничего не можете сделать. MySql не может оптимизировать этот запрос и избежать временной таблицы.

Согласно этой ссылке: http://dev.mysql.com/doc/refman/5.7/en/group-by-optimization.html
существуют два метода MySql использует для оптимизации GROUP BY.


Первый метод - Сыпучие Index Scan - не может быть использована для запроса, так как это условие не отвечает:

Единственные агрегатные функции, используемые в списке выбора (если таковые имеются) MIN() и MAX() ....

Ваш запрос содержит СУММ, поэтому MySql не может использовать вышеуказанный метод оптимизации.


Второй метод - Tight Index Scan - не может быть использована для запроса, так как это условие не отвечает:

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

Ваш запрос, используя только оператор диапазона: WHERE c.evedate>='2013-10-19', нет каких-либо условий равенства в ИНЕКЕ, поэтому этот метод не может быть использован для оптимизации запроса.

+2

, вы правы в вышеуказанных пунктах. Но я прочитал здесь (stackoverflow), что mysql может обрабатывать таблицу 400 миллионов записей, и многие администраторы баз данных ежедневно занимаются такой ситуацией. Итак, есть ли способ добиться некоторой оптимизации путем изменения запроса или изменения параметра my.ini или любым способом? – Aamir

Смежные вопросы