Добавление LIMIT к запросу увеличивает время запроса более чем на 1000% - PullRequest
0 голосов
/ 03 февраля 2012

Я выполняю следующий запрос:

SELECT 
        MyField,
        COUNT(*) AS MyCount
    FROM
        MyTable
    NATURAL JOIN
        AnotherTable
    WHERE
        Timestamp >= 1000 AND Timestamp <= 10000
    GROUP BY
        MyField
    ORDER BY
        MyCount DESC;

Это работает нормально и занимает около 6 секунд.Если я хочу ограничить результат отображением только 20 самых высоких MyCount с, я добавляю LIMIT 20 в конец запроса.Внезапно это займет 6 минут!

Вывод EXPLAIN для исходного запроса:

+----+-------------+-------------+--------+---------------------------+---------+---------+---------------------------+---------+----------------------------------------------+
| id | select_type | table       | type   | possible_keys             | key     | key_len | ref                       | rows    | Extra                                        |
+----+-------------+-------------+--------+---------------------------+---------+---------+---------------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | MyTable     | ALL    | mytable_fkey              | NULL    | NULL    | NULL                      | 6858209 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | AnotherTable| eq_ref | PRIMARY                   | PRIMARY | 4       | test.MyTable.FKeyID       |       1 | Using index                                  |
+----+-------------+-------------+--------+---------------------------+---------+---------+---------------------------+---------+----------------------------------------------+

Вывод EXPLAIN для запроса с LIMIT 20:

+----+-------------+-------------+--------+---------------------------+-------------------------+---------+---------------------------+---------+----------------------------------------------+
| id | select_type | table       | type   | possible_keys             | key                     | key_len | ref                       | rows    | Extra                                        |
+----+-------------+-------------+--------+---------------------------+-------------------------+---------+---------------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | MyTable     | index  | mytable_fkey              | myfield_timestamp_index | 771     | NULL                      | 6858209 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | AnotherTable| eq_ref | PRIMARY                   | PRIMARY                 | 4       | test.MyTable.FKeyID       |       1 | Using index                                  |
+----+-------------+-------------+--------+---------------------------+-------------------------+---------+---------------------------+---------+----------------------------------------------+

Чем это объясняется?Есть ли лучший способ, которым я могу ограничить количество строк?

1 Ответ

0 голосов
/ 03 февраля 2012

Если вы видите Using temporary; Using filesort в вашем EXPLAIN выводе, вы, вероятно, пропускаете подходящий индекс, и вас убивают из-за него.

Убедитесь, что поля JOIN и GROUP BYоба доступны в одном и том же индексе.

...