假设我有以下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提供了哪些工具来提高上述查询的效率?谢谢!
答案 0 :(得分:4)
如果您只是使用一般技术,那么就已经有关于该主题的SO问题,更不用说optimization上的MySQL手册部分了。
如果您正在查询查询的具体建议,请注意,如果列通过函数传递,则MySQL无法应用索引。您需要摆脱* _end和next_ *列周围的UNIXTIMESTAMP
和CONCAT
调用。一种方法是更改表架构:将列组合为DATETIME
或TIMESTAMP
类型的“结束”和“下一列”。另一种方法是将当前时间分成日期和时间,并使用它来分别与列进行比较。
答案 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
。