提高查询效率

时间:2012-03-20 23:36:05

标签: php mysql

假设我有以下SQL查询

SELECT id, name, title, description, time 
  FROM entity 
  WHERE UNIXTIMESTAMP(CONCAT(date_end, time_end)) > UNIXTIMESTAMP(NOW()) 
    AND UNIXTIMESTAMP(CONCAT(next_date, next_time)) < UNIXTIMESTAMP(NOW())

我正在研究视图和其他方法来提高查询效率。问题是如果我有超过10,000个实体要处理;然后查询将需要很长时间。

MySQL提供了哪些工具来提高上述查询的效率?谢谢!

5 个答案:

答案 0 :(得分:4)

如果您只是使用一般技术,那么就已经有关于该主题的SO问题,更不用说optimization上的MySQL手册部分了。

如果您正在查询查询的具体建议,请注意,如果列通过函数传递,则MySQL无法应用索引。您需要摆脱* _end和next_ *列周围的UNIXTIMESTAMPCONCAT调用。一种方法是更改​​表架构:将列组合为DATETIMETIMESTAMP类型的“结束”和“下一列”。另一种方法是将当前时间分成日期和时间,并使用它来分别与列进行比较。

答案 1 :(得分:2)

您的查询只有10k条记录可以处理,但这应该更高效,因为它不涉及任何类型的转换 -

SELECT id, name, title, description, time 
FROM entity 
WHERE (date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME))
AND (next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME))

(next_date,date_end)上的复合索引也应该有助于提高性能,但如果使用EXPLAIN来检查执行计划,它应该可以帮助您确定最有效的索引。您应该检查(date_end,next_date)上的索引。如果不了解有关数据分布的更多信息,就不可能说哪一个会有所帮助。

答案 2 :(得分:1)

请看一下explain - 它会告诉你发动机罩下发生了什么。

答案 3 :(得分:1)

也许看一下使用datetime字段而不是两个字段 - 这会在查询中删除不必要的数据转换。

SELECT id, name, title, description, time 
FROM entity 
WHERE NOW() BETWEEN (date_time_end AND date_time_next);

如果不根据日期对表进行分区,请不要认为你会好得多。

答案 4 :(得分:0)

我认为这样可以在不改变数据库架构的情况下提高查询性能。

SELECT id, name, title, description, time FROM entity 
WHERE NOW() BETWEEN ADDTIME(next_date, next_time) AND ADDTIME(date_end, time_end)

实际上,BETWEEN会与>=<=进行比较。如果您不希望它与此类似,请与><保持比较,而不是使用BETWEEN