mysql - 限制查询不能生效

标签 mysql limit explain

我有一个关于 Mysql 查询的问题。

我有一些缓慢的查询。这是其中之一:

SELECT  
    xxx_accounts.id 
     , xxx_accounts.name 
     , xxx_accounts.account_name 
     , xxx_accounts.address_postalcode 
     , xxx_accounts.address_city 
     , xxx_accounts.address_state  
     , xxx_accounts.date_modified 
     , xxx_accounts.assigned_user_id   
FROM 
    xxx_accounts  
WHERE
    xxx_accounts.deleted = 0 
ORDER BY 
    xxx_accounts.date_entered DESC 
LIMIT 4434950, 11;

即使使用limit查询也需要将近2分钟。

解释在这里:

+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+                     
| id | select_type | table        | type | possible_keys                                                                  | key                     | key_len | ref   | rows    | Extra       |
+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+
|  1 | SIMPLE      | xxx_accounts | ref  | idx_deleted_datemodified,idx_deleted_addresspostalcode,idx_deleted_dateentered | idx_deleted_dateentered | 2       | const | 1861322 | Using where |
+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+

这个解释说行是总计数。

但是,这个SQL被修改为limit ""query,LIMIT 1,11"",它需要几秒(比如1或2秒)。

这些 SQL 的区别在于 LIMIT 4434950,11LIMIT 1,11

这个问题能以某种方式解决吗?

最佳答案

了解这两个限制之间的区别:

"LIMIT 1,11":表示您只获取从 11 偏移量开始的 1 条记录。

"LIMIT 4434950,11":表示您正在从 11 偏移量开始获取 4434950 条记录。在这个查询表中,扫描了数千行以获得 4434950 条记录,然后停止,这肯定会花费更多的时间和资源,因为结果集也有很多行。

较高的偏移量会减慢查询速度是正常的,因为查询需要计算第一个 OFFSET + LIMIT 记录(并且只取其中的 LIMIT 个)。该值越高,查询运行的时间越长。

查询不能直接转到 OFFSET,因为首先,记录的长度可能不同,其次,删除的记录可能存在间隙。它需要检查并计算途中的每条记录。

加快查询速度的一些技巧:

MySQL 不能直接转到第 10000 条记录(或您建议的第 80000 个字节),因为它不能假设它是这样打包/排序的(或者它具有 1 到 10000 之间的连续值)。尽管实际上可能是这样,但 MySQL 不能假设没有空洞/间隙/删除的 ID。

所以,

SELECT * FROM large ORDER BY id LIMIT 10000, 30 

会很慢(呃),

SELECT * FROM large WHERE id >  10000 ORDER BY id LIMIT 30 

会很快(呃),并且会返回相同的结果,前提是没有丢失的 ID(即间隙)。

Very good explanation here

关于mysql - 限制查询不能生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43337824/

相关文章:

php - 当我向数据库插入一个值时,它向数据库插入了两行

javascript - 如何使用 javascript 限制 append 函数?

postgresql - 缓慢的 Postgres 9.3 查询,再次

sql - 如何处理 silent mysql sum() 整数溢出?

php - ajax 弹出窗口上的提交按钮不起作用

mysql - 更新数据库中某些大写字段的简单方法?

java - 限制数字输入 JTextField

javascript - 必应图像搜索 API

sql - 在mysql中, "explain ..."总是安全的吗?

mysql - 了解 EXPLAIN 语句的输出 (MySQL)