假设我有以下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提供了哪些工具来提高上述查询的效率?谢谢!
发布于 2012-03-21 07:43:44
如果您只是想了解一般技术,那么这个主题上已经有很多问题了,更不用说optimization上的MySQL手册部分了。
如果您要为查询提供特定的建议,请注意,如果列通过函数传递,则MySQL不能应用索引。您需要删除*_end和next_*列周围的UNIXTIMESTAMP和CONCAT调用。一种方法是更改表模式:将列合并为DATETIME或TIMESTAMP类型的"end“和"next”列。另一种方法是将当前时间分离为日期和时间,并使用该日期和时间分别与列进行比较。
发布于 2012-03-21 07:50:30
您的查询只需要处理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)上的索引。如果不对数据的分布有更多的了解,就不可能说出哪一个最有帮助。
发布于 2012-03-21 07:42:52
请看一下explain -它会告诉你引擎盖下发生了什么。
https://stackoverflow.com/questions/9796626
复制相似问题