Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql innodb选择偏移量慢_Mysql_Innodb - Fatal编程技术网

mysql innodb选择偏移量慢

mysql innodb选择偏移量慢,mysql,innodb,Mysql,Innodb,我在表中有2990000条记录,这消耗了太多的查询执行时间 SELECT * FROM table_records LIMIT 50 OFFSET 1999950 this query taking 33.087 sec 我已将抵销改为2000000 SELECT * FROM table_records LIMIT 50 OFFSET 2000000 this query taking 2.030 sec 解释 EXPLAIN SELECT * FROM table_records LIM

我在表中有2990000条记录,这消耗了太多的查询执行时间

SELECT * FROM table_records LIMIT 50 OFFSET 1999950
this query taking 33.087 sec
我已将抵销改为2000000

SELECT * FROM table_records LIMIT 50 OFFSET 2000000
this query taking 2.030 sec
解释

EXPLAIN SELECT * FROM table_records LIMIT 50 OFFSET 29941250


id | select_type | table         | type   | possible_keys | key     | key_len | ref    |rows     | Extra   
1  | SIMPLE      | table_records | index  | (NULL)        | PRIMARY | 4       | (NULL) |29900771 |         
我已删除刚设置为限制的偏移量

SELECT * FROM table_records LIMIT 50
this query taking 0.002 sec

任何建议或想法都值得赞赏。

有一种解决方案可以更快地完成,但只有当您有主键int且此表中没有空白时,它才会起作用。我的意思是你不允许执行删除。在这种情况下,您的查询将如下所示:

SELECT * FROM table_records where id >= 1999950 order by id LIMIT 50;

这都是关于缓存的

简单地说,补偿很糟糕。它必须读取并忽略所有偏移行,然后传递限制行

当跳过行时,它必须获取行-如果它们在磁盘上,这需要时间;如果它们缓存在RAM中,速度会快得多。通常是10倍的速度

在您的例子中可能发生了什么:第一个查询在RAM中发现了很少(如果有的话)行,因此它必须找到1999950行中的大部分或全部

然后,您的第二个查询快速扫描1999950行,然后从磁盘获取最后50行。或者可能是最后50个已经出现了,因为I/O的单位是一个记录块

对于LIMIT和/或OFFSET,EXPLAIN很少给出任何线索-它通常提供表中总行数的估计值

你的例子还有另一个问题。。。你没有订单。因此,引擎可以自由地传送它喜欢的任何行。通常这是可以预测的,但有时你会得到惊喜

但是,一旦您添加了ORDER BY,甚至在获得第一条记录之前,可能还需要一个临时表和排序!也就是说,选择。。。订货人。。限制50可能和其他所有限制一样慢-如果您是通过对涉及的索引等不方便的方式进行排序的话


看。这包括一个解决方法,即记住您的结束位置。并显示了如何高效地获取接下来的1000行,即使ID中存在间隙。

偏移量越高,查询速度越慢。为了避免使用offsetis这个错误或限制,我使用它来列出页面的分页:还有其他解决方案吗?删除一些记录后将失败,但我从中找到了解决方案