Я сталкиваюсь с некоторыми довольно важными проблемами, связанными с использованием "ORDER BY" -statements в моем SQL-коде.
Все в порядке, пока я не использую ORDER BY-statements в 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 -range при сортировке по значению value2?
В настоящее время выборка выполняется, когда НЕ используется предложение ORDER BY.
См. следующий вывод EXPLAIN QUERY:
OK, when NOT using ORDER BY: 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 | +----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
However, when using ORDER BY I get "Using filesort": 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);) не решает проблему. После добавления такого индекса вы все равно получите "Using filesort".
Обновление # 2: Ограничение, о котором я не упоминал в моем вопросе, состоит в том, что я бы скорее изменил структуру таблицы (например, добавив индексы и т.д.), чем изменив используемые SQL-запросы, Запросы SQL автоматически генерируются с использованием Hibernate, поэтому рассмотрите те более или менее фиксированные.