相同的查询,对不同数据的戏剧性不同表现。 MySQL的

时间:2011-09-21 23:27:05

标签: mysql performance limit

所以,我有这个庞大的数据库,有40百万条记录。

查询很简单(a_view是视图!)

select * from a_view where id > x LIMIT 10000

这是我得到的行为:如果x是一个小数字(int),则查询超快。 当x> 29百万的查询开始需要几分钟。如果它接近30百万,则需要数小时。等等...

为什么?我该怎么做才能避免这种情况?

我使用InnoDB作为引擎,表有索引。

限制值是一个关键值,它会影响性能。如果它很小,查询总是很快。但如果x接近30百万,那么我需要非常小心地设置它不要太大(少于300个),但它仍然很慢,但不会永远消失

如果您需要更多详细信息,请随时提出。

编辑:这是解释

+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
| id | select_type | table | type   | possible_keys   | key     | key_len | ref                 | rows    | Extra       |
+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
|  1 | SIMPLE      | aH    | index  | PRIMARY         | PRIMARY | 39      | NULL                | 3028439 | Using index |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.aH.albumID      |       1 | Using where |
|  1 | SIMPLE      | aHT   | ref    | PRIMARY,albumID | albumID | 4       | odb.a.albumID       |       4 |             |
|  1 | SIMPLE      | t     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.aHT.id          |       1 | Using where |
|  1 | SIMPLE      | g     | eq_ref | PRIMARY         | PRIMARY | 4       | odb.t.genre         |       1 |             |
|  1 | SIMPLE      | ar    | eq_ref | PRIMARY         | PRIMARY | 4       | odb.t.artist        |       1 |             |
+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+

1 个答案:

答案 0 :(得分:0)

这是猜测。基本上,您的视图是在某些表上的选择。 “id”可以是行号。 “x”越大,在获得所需数据之前,需要创建(并丢弃)更多选择行。这就是为什么当你的“x”增加时你的查询会变慢的原因。

如果这是真的,一个解决方案可能是创建一个包含rownum的表和一个按照您正在使用的“order by”排序的主键。拥有该表后,您可以将其与其余数据一起使用,并按rownum范围选择数据窗口。