gpt4 book ai didi

php - MySQL 选择高效的第一行和最后一行

转载 作者:行者123 更新时间:2023-11-29 01:37:56 25 4
gpt4 key购买 nike

我想从 MySQL 数据库中的表中获取两行。这两排一定是我点的第一排和最后一排。为此,我提出了两个查询,这两个:

SELECT dateBegin, dateTimeBegin FROM worktime ORDER BY dateTimeBegin ASC LIMIT 1;";
SELECT dateBegin, dateTimeBegin FROM worktime ORDER BY dateTimeBegin DESC LIMIT 1;";

我决定不获取整个集合,而是在 PHP 中选择第一个和最后一个,以避免可能出现非常大的数组。我的问题是,我有两个查询,但我真的不知道这有多有效。例如,我想将它们与 UNION 结合使用,但是我仍然必须对未排序的列表进行两次排序,我也想避免这种情况,因为第二次排序与第一次排序完全相同

我想订购一次,然后选择这个有序列表的第一个和最后一个值,但我不知道比使用两个查询的方法更有效的方法。我知道性能优势不会很大,但我知道列表正在增长,并且随着它们变得越来越大,我对某些表执行此部分,我需要最有效的方法来执行此操作。我找到了几个类似的主题,但没有一个主题解决了这个特定的性能问题。

非常感谢任何帮助。

最佳答案

(这既是“回答”,也是对部分评论错误的反驳。)

INDEX(dateTimeBegin)

将有助于 SELECT ... ORDER BY dateTimeBegin ASC LIMIT 1 和另一端的相应行,使用 DESC

MAX(dateTimeBegin)找到该列的最大值;它不会直接找到该行中的其余列。这将需要一个子查询或 JOIN

INDEX(... DESC) -- DESC 被 MySQL 忽略。这几乎从来都不是缺点,因为优化器愿意通过索引向任一方向移动。重要的是ORDER BY x ASC, y DESC 不能使用INDEX(x, y),也不是INDEX( x 升序,y 降序)。这是 MySQL 的缺陷。 (除此之外,我同意戈登的“回答”。)

( SELECT ... ASC )
UNION ALL
( SELECT ... DESC )

与两个单独的选择相比,如果有的话,不会提供太多的性能优势。选择使代码更简单的技术。

拥有一个DATETIME(或TIMESTAMP)字段几乎总是比拆分DATE和/或更好时间SELECT DATE(dateTimeBegin), dateTimeBegin ... 工作简单,而且“足够快”。另请参阅函数 DATE_FORMAT()。我建议删除 dateBegin 列并相应地调整代码。请注意,缩小表格实际上可能比 DATE() 的成本更快地加快处理速度。 (差异将是无穷小的。)

如果没有以 dateTimeBegin 开始的索引,任何技术都会很慢,并且随着表大小的增长而变慢。 (我很确定它可以在一次完整的传递中找到 both MIN()MAX(),并且无需排序。一对 ORDER BYs 需要两次完整的传递,加上两次排序;5.6 可能有一个几乎消除排序的优化。)

如果有两行具有完全相同的最小dateTimeBegin,您将无法预测得到哪一行。

关于php - MySQL 选择高效的第一行和最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com