【问题标题】:Optimizing query with LIMIT mysql使用 LIMIT mysql 优化查询
【发布时间】:2021-10-11 09:27:44
【问题描述】:

我有一个表,我们称之为mytable,它包含大量数据,我需要根据varchardatetime 类型的某些列值查询这些数据(这些列都没有索引,并且我不能为此查询使用主键)。

我需要通过分页获取数据,为此我使用变量varLimitvarOffset。现在我在经过大量实验后注意到,尽管LIMIT varLimit 在结果计数很高时优化了查询,但当它大于结果计数时会严重降低性能。如果查询返回 0 行,则应用 LIMIT 20 比删除 LIMIT 需要多 30 秒!

这是我的查询

SELECT `data`
FROM mytable
WHERE (conditions...)
ORDER BY `heure` desc LIMIT varLimit OFFSET varOffset;

为了优化这一点,我必须首先重新计算varLimit,以将其设置为结果计数与其自身之间的最小值(varLimit = 20,但如果查询返回 10 行,则应设置varLimit = 10。最终代码变成:

SELECT COUNT(*) INTO varCount
FROM mytable
WHERE (conditions...);

SELECT LEAST(varLimit, varCount - varOffset) INTO varLimit; -- Assume varOffset <= varCount 

SELECT `data`
FROM mytable
WHERE (conditions...)
ORDER BY `heure` desc LIMIT varLimit OFFSET varOffset;

有什么方法可以在单个查询中完成,或者有更好的方法来实现吗?

【问题讨论】:

  • 我认为这是 LIMIT 子句的一个重大缺点,如果它在结果集较小的情况下表现不佳
  • 感谢您的评论,我更了解您的问题。你需要一个索引。但是,帮助您弄清楚您需要什么索引,我们需要更多信息。请read this,然后edit您的问题。

标签: mysql query-optimization


【解决方案1】:

很遗憾,您不能在 LIMIT 和 OFFSET 子句中使用变量。它们必须是常量,因此您必须在应用程序代码中或通过使用字符串连接创建 MySQL "prepared statement" 来执行此限制/偏移计算。

【讨论】:

  • 感谢您的回复!不,查询实际上是存储过程的一部分,它对变量完全起作用,我只需要改进它,比如在单个查询中设置最小计数和 varLimit,但它又会变成子查询。
  • 如果有帮助,我正在使用 MySQL 5.7.21..
  • 参见dev.mysql.com/doc/refman/8.0/en/select.html“在存储程序中,LIMIT 参数可以使用整数值的例程参数或局部变量来指定。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多