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

同样的查询,对不同数据的戏剧性表现不同。 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 |    | 
+----+-------------+-------+--------+-----------------+---------+---------+---------------------+---------+-------------+ 
+0

确定的ID列索引? – JohnD

+0

什么是表/视图和索引是什么? –

+0

从理论上讲,如果你有一个关于“id”的索引,那么性能应该没什么区别。 –

这是一个猜测。基本上,你的观点是一些表格上的选择。 “id”可以是行号。你的“x”越大,在你得到你想要的任何数据之前,需要创建(和丢弃)更多的选择行。这就是为什么你的查询在你的“x”增加时变慢。

如果这是真的,一个解决方案可能是创建一个包含由“按订单”无论你是使用排序ROWNUM和主键的表。一旦你有了这个表格,你就可以将它与其余的数据结合起来,并通过一个rownum范围来选择你的数据窗口。

+0

对不起,我如何验证是否是这样的问题?我不太明白我该如何创建该表格。 – Danny

+0

我正在寻找不同的想法,可能是您的性能问题的原因。如果您发布a_view定义,这将有所帮助。特别是,“id”对应什么? –

+0

id对应于odb.t.id,它等于odb.aHT.id(它在解释中)。我加入了这两列表中的t和aHT。 – Danny