添加 Limit 可以加快 mysql 查询速度,为啥?
Posted
技术标签:
【中文标题】添加 Limit 可以加快 mysql 查询速度,为啥?【英文标题】:Adding Limit speeds up mysql query , WHY?添加 Limit 可以加快 mysql 查询速度,为什么? 【发布时间】:2013-01-12 12:15:42 【问题描述】:我有一个带有 INNER JOIN 的简单查询。连接的表有 1500 和 2500 行。两个表都有一个主键。未在此键上完成联接。
此查询的结果集有 1500 行。 当我运行这个查询需要 20 秒... (AN ETERNITY)
SELECT so.order_id
FROM shop_orders so
INNER JOIN shop_order_payments sop
ON so.order_code = sop.order_code
WHERE sop.status = 9
ORDER BY date_created DESC
当我在末尾添加“LIMIT 1500”时,查询只需 1 秒。 (当我删除它时,它又需要 20 秒,所以它不是缓存......)
-
这是为什么?
有没有一种快速的方法来找出这个查询的结果有多少行?
注意:我使用 mysql() 函数在 php 脚本中运行此查询)
*update1: EXPLAIN 的结果
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE sop ALL NULL NULL NULL NULL 1153 使用 where;使用临时的;使用文件排序 1 SIMPLE 所以 ALL NULL NULL NULL NULL 2529 使用 where 更新 2:我按照 cmets 中的要求运行了 DESC
payment_id - int(11) NO PRI auto_increment 时间戳 - 时间戳 NO CURRENT_TIMESTAMP order_code - varchar(100)NO 接受 - varchar(50) 否 金额 - varchar(20) 否所以只显示一个主索引,这还不够索引吗?
【问题讨论】:
EXPLAIN
说什么?
查询需要很长时间才能运行,因为您可能缺少索引。你能得到这个查询的结果吗? DESC shop_orders
和 DESC shop_order_payments
?
你有什么索引?可以为每个表显示SHOW CREATE TABLE ...
的输出吗?
【参考方案1】:
EXPLAIN
表示查询未使用索引。因此它执行全表扫描,导致它很慢。
尝试运行此语句,
ALTER TABLE shop_orders ADD INDEX td_idx (order_code);
ALTER TABLE shop_order_payments ADD INDEX td2_idx (order_code);
然后再次运行SELECT
查询。
更新 1
您的表有一个索引,但在列 payment_id
上,在本例中未使用该索引,因为连接使用的是列 order_code
。您还必须在该列上定义一个索引。
【讨论】:
查询现在只需 0.05 秒...非常感谢!以上是关于添加 Limit 可以加快 mysql 查询速度,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何加快 LIMIT 子句中偏移量较大的 MySQL 查询?
假如mysql数据库单表有100W行记录,有哪些方式加快查询速度
oracle中加索引会不会加快更新的速度?有人说会减慢更新速度?谁知道为啥吗?
MySQL 查询 limit 1000,10 和 limit 10 速度一样快吗? 深度分页如何破解