同样的查询,对不同数据的戏剧性表现不同。 MySQL
问题描述:
所以,我有这个庞大的数据库有40百万条目。同样的查询,对不同数据的戏剧性表现不同。 MySQL
查询是一个简单的(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 | | +----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+
答
这是一个猜测。基本上,你的观点是一些表格上的选择。 “id”可以是行号。你的“x”越大,在你得到你想要的任何数据之前,需要创建(和丢弃)更多的选择行。这就是为什么你的查询在你的“x”增加时变慢。
如果这是真的,一个解决方案可能是创建一个包含由“按订单”无论你是使用排序ROWNUM和主键的表。一旦你有了这个表格,你就可以将它与其余的数据结合起来,并通过一个rownum范围来选择你的数据窗口。
确定的ID列索引? – JohnD
什么是表/视图和索引是什么? –
从理论上讲,如果你有一个关于“id”的索引,那么性能应该没什么区别。 –