mysql不能访问order,使用ORDER BY时,MySQL不使用索引(“Using filesort”)

由于在我的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自动生成的,所以考虑一些或多或少的固定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值