由于查询而导致页面加载缓慢

时间:2013-01-30 18:23:54

标签: php mysql

我在页面上运行此查询以使用foreach语句在表中显示记录。我认为这会导致页面加载缓慢。我在想第二行可能导致问题。但是,如果我删除该行WHERE code = 'FE',该页面会抛出一个foreach错误Warning: Invalid argument supplied for foreach()

$arrquery = "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 arrtime ASC";

$arrlist = DB::get_results($arrquery);

的foreach:

foreach($arrlist as $flight) 

4 个答案:

答案 0 :(得分:2)

您查询的这一行可能会导致您遇到问题:

AND locate(dayofweek(convert_tz(now(),'+1:00','+0:00'))-1,".TABLE_PREFIX."schedules.daysofweek)>0

此WHERE条件无法使用索引,因此除了在其他WHERE条件和ORDER BY条件中使用的列上具有索引之外,您无法优化此查询。

根据您的评论确定我正在更新我的答案。我认为你最好的选择是使用字符串比较,所以在PHP中为你感兴趣的日子建立一个字符串。所以,你想要任何有0天,2天和4天的记录。你会建立一个像这样的字符串:

$day_search = '%0%2%4%';

或者如果您将日期作为数组:

$day_array = array(1,3,5);
$day_search = '%' . implode('%', $day_array) . '%';

然后你会像这样进行搜索:

AND dayofweek LIKE '$day_search'

当然,您需要dayofweek上的索引以及WHEREORDER BYGROUP BYJOIN条件中使用的所有其他列(尽管GROUP BY和JOIN不适用于此处。)

老实说,这个表确实应该被标准化,以便将日期放在一个单独的表中。这样,每个记录在每个适用的日期都可以在另一个表中有一个条目,您可以使用更合适的WHERE条件(例如IN()

)在JOIN中查询

答案 1 :(得分:1)

请勿删除第WHERE code = 'FE'行,因为它会使查询失败,只需删除code = 'FE' AND条件,或删除查询中的其余条件

答案 2 :(得分:0)

我相信这会对你有所帮助:

CREATE INDEX idx_code ON phpvms_schedules (code);

但是,我在评论中建议发布EXPLAIN,这有助于我们澄清

答案 3 :(得分:0)

我建议您在php中进行计算,然后将其注入查询