2014-12-13 2 views
1

У меня есть таблица с двумя столбцами: id (первичный ключ) и writeForm (VARCHAR 255). Общее количество строк составляет около 850 000.Как улучшить ORDER BY ... LIMIT ... query peformance?

мне нужно выполнить следующий запрос:

SELECT writtenform FROM `dedict_uniqueWF` order by id LIMIT 1,20000 

Этот запрос занимает более 10 минут. Когда я запускаю запрос объяснения, кажется, что он не использует индекс. Любая идея почему?

Объяснить запрос:

id select_type  table    type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE   dedict_uniqueWF  ALL  NULL   NULL NULL  NULL 836753 Using filesort 

Объясните таблицу:

Field   Type   Null Key  Default  Extra 
id    int(11)   NO  PRI  NULL  auto_increment 
writtenForm  varchar(255) YES  NULL 

Тем временем я добавил новый индекс. Еще один результат в объяснении. Показать Индексы:

Table    Non_unique  Key_name  Seq_in_index  Column_name  Collation  Cardinality  Sub_part  Packed  Null Index_type Comment  Index_comment 
dedict_uniqueWF  0    PRIMARY   1     id    A    836753   NULL   NULL    BTREE 
dedict_uniqueWF  1    writtenForm  1     writtenForm  A    836753   NULL   NULL  YES  BTREE 

Добавления условия использования индекса силы будет иметь точно такой же результат в объясняющем запросе (Использование FileSort):

explain SELECT writtenform FROM `dedict_uniqueWF` use index(PRIMARY) order by id LIMIT 1,20000 
+0

Эй, вы нашли и прочитали этот ответ: http://stackoverflow.com/questions/12148943/mysql-performance-slow-using-filesort? –

+0

Интересный первичный ключ индексируется по умолчанию, и он должен учитывать индекс. Можете ли вы проверить индексы в таблице 'show indexes from dedict_uniqueWF' –

+0

Что происходит, когда вы принудительно используете первичный (с помощью' SELECT ... FROM ... USE KEY FOR ORDER BY ... ')? – raina77ow

ответ

2

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

Этот запрос

SELECT id FROM dedict_uniqueWF ORDER BY id LIMIT 1,20000 

получает вас идентификаторами вам нужно.

Затем этот запрос использует этот список идентификаторов для доступа только к требуемым строкам.

SELECT writtenform 
    FROM dedict_uniqueWF 
    JOIN (
      SELECT id FROM dedict_uniqueWF ORDER BY id LIMIT 1,20000 
     ) AS a ON dedict_uniqueWF.id = a.id 
ORDER BY a.id 

получает ваш результирующий набор. Послушайте, набор результатов в 20K строк довольно большой и может занять некоторое время, чтобы сгенерировать и передать с вашего сервера MySQL в ваше приложение.

Вы также можете попробовать комплексный индекс на (id, writtenform), чтобы ускорить этот запрос. Индекс с одним столбцом в writtenform не будет полезен в этом запросе.