Я столкнулся с некоторыми довольно серьезными проблемами производительности из-за использования в моем SQL-коде «ORDER BY».
Все хорошо, если я не использую операторы ORDER BY в SQL. Однако, как только я ввожу ORDER BY: s в коде SQL, все резко замедляется из-за отсутствия правильной индексации. Можно было бы предположить, что исправить это было бы тривиально, но, судя по дискуссиям на форуме и т. Д., Это, кажется, довольно распространенная проблема, и я пока не вижу окончательного и краткого ответа на этот вопрос.
Вопрос: Учитывая следующую таблицу ...
CREATE TABLE values_table (
id int(11) NOT NULL auto_increment,
...
value1 int(10) unsigned NOT NULL default '0',
value2 int(11) NOT NULL default '0',
PRIMARY KEY (id),
KEY value1 (value1),
KEY value2 (value2),
) ENGINE=MyISAM AUTO_INCREMENT=2364641 DEFAULT CHARSET=utf8;
... как создать индексы, которые будут использоваться при запросе таблицы для диапазона value1 при сортировке по значению value2 ?
В настоящее время выборка в порядке, если НЕ используется предложение ORDER BY.
См. Следующий вывод EXPLAIN QUERY:
<b>OK, when NOT using ORDER BY:</b>
EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 limit 10;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
<b>However, when using ORDER BY I get "Using filesort":</b>
EXPLAIN select ... from values_table this_ where this_.value1 between 12345678 and 12349999 order by this_.value2 asc limit 10;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
| 1 | SIMPLE | this_ | range | value1 | value1 | 4 | NULL | 3303 | Using where; Using filesort |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------------+
Некоторая дополнительная информация о содержании таблицы:
SELECT MIN(value1), MAX(value1) FROM values_table;
+---------------+---------------+
| MIN(value1) | MAX(value2) |
+---------------+---------------+
| 0 | 4294967295 |
+---------------+---------------+
...
SELECT MIN(value2), MAX(value2) FROM values_table;
+---------------+---------------+
| MIN(value2) | MAX(value2) |
+---------------+---------------+
| 1 | 953359 |
+---------------+---------------+
Пожалуйста, дайте мне знать, нужна ли какая-либо дополнительная информация для ответа на вопрос.
Заранее большое спасибо!
Обновление № 1: Добавление нового составного индекса ( ALTER TABLE values_table ADD INDEX (значение1, значение2); ) не решает проблему. После добавления такого индекса вы все равно получите «Использование файловой сортировки».
Обновление № 2: Ограничение, которое я не упомянул в своем вопросе, заключается в том, что я предпочел бы изменить структуру таблицы (скажем, добавив индексы и т. Д.), Чем изменить используемые запросы SQL. Запросы SQL генерируются автоматически с использованием Hibernate, поэтому рассмотрите те, которые более или менее фиксированы.