【问题标题】:MYSQL query and LIMIT to one rowMYSQL 查询和限制为一行
【发布时间】:2023-03-07 19:46:01
【问题描述】:

非常简单,但让我很困惑:

SELECT `start`, `stop` FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,1

12 秒

SELECT `start`, `stop` FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,2 or xxx

0.07 秒

解释说 限制 0, 1

id  select_type table   type    possible_keys             
1   SIMPLE     loadtime index   utilisateur_id_2,utilisateur_id,type    
key     key_len ref     rows    Extra
PRIMARY   4     NULL    10089   Using where

限制 0,x

id  select_type table     type      possible_keys
1   SIMPLE     loadtime   ref       utilisateur_id_2,utilisateur_id,type
key           key_len   ref     rows    Extra
utilisateur_id  62     const    12103   Using index condition; Using where; Using filesort

所以第一个查询自然不会使用索引。

服务器在 MySQL 5.5.32 上

【问题讨论】:

  • 您可以添加EXPLAIN 输出吗?
  • 我猜你已经执行了第一个查询,然后是第二个。之后第二个查询从第一个开始使用缓存并且“快速”
  • 我也是这么想的,但是无论我运行查询多少次以及以什么顺序运行查询,时间都是一样的。
  • 我不确定,但是如果它改变了某些东西,你可以尝试使用“”这个运算符而不是“!=”和 c
  • 我很好奇,我真的不喜欢优化器如何从一个查询到另一个类似的查询发生如此大的变化。 +1

标签: mysql sql query-performance


【解决方案1】:

问题很简单:由于某种原因(可能是many),MySQL 服务器决定在limit 0,1 的情况下这是一个更好的主意(即服务器期望它需要更少的时间和计算)来做全表扫描以便为您提供正确的结果,而不是使用索引。

由于这是一个预测,it could happen that it may be wrong 和使用索引会更好(如limit 0,x 的情况)。既然你注意到了性能差异,你可以强制查询使用你认为最好的索引,如下(和建议here):

SELECT `start`, `stop` FORCE INDEX (condition) FROM loadtime
WHERE utilisateur_id = '202931999'
AND `type` = 'stat'
AND `stop` !=0
ORDER BY id DESC
LIMIT 0,1

【讨论】:

  • 是的,你是对的,我实际上强制索引 FORCE INDEX (utilisateur_id) 并且按预期工作。根据我所做的分析,全表扫描将来自于 WHERE utilisateur_id = '202931999' 在数据中出现大约 20k 次这一事实。仍然我不明白为什么在限制 0、1 情况下会发生这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多