由于在我的SQL代码中使用“ORDER BY” – 说明,我遇到了一些相当重大的性能问题。
只要我没有在SQL中使用ORDER BY-statements,一切都很好。但是,一旦我在SQL代码中引入了ORDER BY:s,由于缺少正确的索引,所有这些都会显着减慢。人们会认为这样做是微不足道的,但从论坛讨论等方面来看,这似乎是一个相当常见的问题,我还没有看到这个问题的确切简明的答案。
问题:给出下表…
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输出:
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(value1,value2);)不能解决问题。添加这样的索引后,仍然会使用“使用filesort”。
更新#2:我在问题中没有提到的约束是,我宁愿更改表的结构(比如添加索引等),而不是更改使用的SQL查询。 SQL查询是使用Hibernate自动生成的,所以考虑一些或多或少的固定。