【发布时间】:2021-10-11 09:27:44
【问题描述】:
我有一个表,我们称之为mytable,它包含大量数据,我需要根据varchar 和datetime 类型的某些列值查询这些数据(这些列都没有索引,并且我不能为此查询使用主键)。
我需要通过分页获取数据,为此我使用变量varLimit 和varOffset。现在我在经过大量实验后注意到,尽管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 子句的一个重大缺点,如果它在结果集较小的情况下表现不佳