один и тот же запрос, разная производительность на разных данных.MySQL - PullRequest
1 голос
/ 22 сентября 2011

Итак, у меня есть огромная база данных с 40 миллионами записей.

запрос простой (a_view - это представление!)

select * from a_view where id > x LIMIT 10000

это поведение, которое я получаю:х - это небольшое число (int), запрос очень быстрый.когда x> 29 миллионов запрос начинает занимать минуты.если это ближе к 30 миллионам, это займет несколько часов.и так далее ...

почему это так?что я могу сделать, чтобы избежать этого?

Я использую InnoDB в качестве движка, таблицы имеют индексы.

значение лимита является критическим, оно влияет на производительность.если он маленький, запрос всегда быстрый.но если x близко к 30 миллионам, тогда мне нужно быть очень осторожным, чтобы установить его не слишком большим (менее 300 сотен), и все же он довольно медленный, но не вечный

Если вам нужно большедетали, не стесняйтесь спрашивать.

РЕДАКТИРОВАТЬ: вот объяснение

+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
| id | select_type | table | type   | possible_keys   | key     | key_len | ref                 | rows    | Extra       |
+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
|  1 | SIMPLE      | aH    | index  | PRIMARY         | PRIMARY | 39      | NULL                | 3028439 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.aH.albumID      |       1 | Using where |
|  1 | SIMPLE      | aHT   | ref    | PRIMARY,albumID | albumID | 4       | odb.a.albumID       |       4 |             |
|  1 | SIMPLE      | t     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.aHT.id          |       1 | Using where |
|  1 | SIMPLE      | g     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.t.genre         |       1 |             |
|  1 | SIMPLE      | ar    | eq_ref | PRIMARY         | PRIMARY | 4       | odb.t.artist        |       1 |             |
+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+

1 Ответ

0 голосов
/ 22 сентября 2011

Вот предположение.По сути, ваш взгляд является выбором для некоторых таблиц.«Идентификатор» может быть номером строки.Чем больше ваш «х», тем больше выбранных строк необходимо создать (и удалить), прежде чем вы сможете получить любые данные, которые вы хотите.Вот почему ваш запрос замедляется, когда увеличивается «x».

Если это так, одним из решений может быть создание таблицы, содержащей rownum и первичный ключ, отсортированный по любому «порядку»с помощью.Получив эту таблицу, вы можете объединить ее с остальными данными и выбрать окно данных по диапазону значений.

...