我的网站加载速度非常慢,只有一个页面加载速度慢,我怀疑这是因为向数据库发送了 MySQL 查询。我怎样才能加快速度?
$depquery = "SELECT * FROM phpvms_schedules
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,".TABLE_PREFIX."schedules.daysofweek)>0
AND phpvms_schedules.enabled = '1'
ORDER BY deptime ASC";
该查询主要用于将信息提取到“出发板”表中。该表按 deptime
排序, 它显示从当前时间开始的结果。但是,我还希望它返回至少 4 个记录,即当前时间之前的 4 个航类。
为了澄清,让我举个例子:
现在是 15:25。因为if(($flight->deptime) >= $time)
和 if($count < 15)
在foreach
里面它将在该时间及之后显示 15 条记录。但是,我还想返回 4 条记录,所以它会在 15:25 之前找到最后 4 条记录。这可能吗?
基本上,我想在当前时间前后上下搜索。
最佳答案
你想要一个 UNION,类似于:
SELECT * phpvms_schedules
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,
".TABLE_PREFIX."schedules.daysofweek)>0
AND phpvms_schedules.enabled = '1'
ORDER BY deptime ASC
LIMIT 15
UNION ALL
SELECT * phpvms_schedules
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,
".TABLE_PREFIX."schedules.daysofweek)<0
AND phpvms_schedules.enabled = '1'
ORDER BY deptime DESC
LIMIT 4
请注意,我没有猜测您的日期函数,因为我不知道它在做什么。我只是将 > 更改为 <,并将 deptime 的排序更改为 DESC。 (其中一个 < > 可能还需要有一个 = 才不会错过现在的出发时间?)
使用 LIMIT 将在数据库中进行过滤,而不是在听起来像您正在做的代码中进行过滤。这将减少在代码中处理此信息的开销,并且应该会更快。我还会在数据库中对这些结果的 UNION 进行排序,并避免在代码中进行。
编辑
为了完全清楚,这应该处理数据库中的排序:
SELECT tbl* FROM (
SELECT * phpvms_schedules
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,
".TABLE_PREFIX."schedules.daysofweek)>0
AND phpvms_schedules.enabled = '1'
ORDER BY deptime ASC
LIMIT 15
UNION ALL
SELECT * phpvms_schedules
WHERE code = 'FE'
AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,
".TABLE_PREFIX."schedules.daysofweek)<0
AND phpvms_schedules.enabled = '1'
ORDER BY deptime DESC
LIMIT 4
) as tbl ORDER BY tbl.deptime ASC
关于php - 当前时间之前的缓慢查询和返回时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607541/