简而言之:一个表有超过1600万条记录[2GB大小].使用ORDER BY*primary_键时,SELECT的限制偏移越大,查询速度越慢*

所以

SELECT * FROM large ORDER BY `id`  LIMIT 0, 30 

所需时间远低于

SELECT * FROM large ORDER BY `id` LIMIT 10000, 30 

That only orders 30 records and same eitherway. 所以 it's not the overhead from ORDER BY.
Now when fetching the latest 30 rows it takes around 180 seconds. How can I optimize that simple query?

推荐答案

较高的偏移量会降低查询速度,这是正常的,因为查询需要对前OFFSET + LIMIT条记录进行计数(并且只取LIMIT条记录).该值越高,查询运行的时间越长.

查询不能直接转到OFFSET,因为首先,记录的长度可能不同,其次,可能与已删除的记录存在差距.它需要在途中判断和清点每条记录.

假设id是MyISAM表的主键,或InnoDB表上唯一的非主键字段,可以使用以下技巧来加速它:

SELECT  t.* 
FROM    (
        SELECT  id
        FROM    mytable
        ORDER BY
                id
        LIMIT 10000, 30
        ) q
JOIN    mytable t
ON      t.id = q.id

参见本文:

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

如何改进对另一个表中多行的查询依赖性

MySQL将JSON值从对象类型更改为数组

在MySQL中使用FIRST_VALUE()

根据日期重叠转换表格

MySQL match against给出奇怪的结果

过滤值为0时如何在MySQL查询中设置条件?

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

仅计算 DATEDIFF (MySQL) 中的工作日

sequelize 中最好的更新方法是什么

mysql insert into select join - 通过连接表将值从一列复制到另一表

如何使用 SQL 聚合和求和相似 Select 的值?

是否可以在一个查询中将字符串附加到许多匹配的行

没有 JDBC 类型的方言映射:1111

MySQL - 使一对值唯一

有什么方法可以显示`gunzip < database.sql.gz | 的进度? mysql ...`进程?

我应该使用什么列数据类型来存储大量文本或 html

MySQL - 我如何输入 NULL?

将 JavaScript 到日期对象转换为 MySQL 日期格式 (YYYY-MM-DD)

在 MySQL 中存储 IPv6 地址