所以,我有这个庞大的数据库,有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 | | +----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
答案 0 :(得分:0)
这是猜测。基本上,您的视图是在某些表上的选择。 “id”可以是行号。 “x”越大,在获得所需数据之前,需要创建(并丢弃)更多选择行。这就是为什么当你的“x”增加时你的查询会变慢的原因。
如果这是真的,一个解决方案可能是创建一个包含rownum的表和一个按照您正在使用的“order by”排序的主键。拥有该表后,您可以将其与其余数据一起使用,并按rownum范围选择数据窗口。