【发布时间】:2017-07-26 21:26:15
【问题描述】:
以下三个查询在性能方面的比较如何?我正在尝试获取 year=2017 的所有记录:
使用EXTRACT:
SELECT count(*), completed_by_id FROM table
WHERE EXTRACT(YEAR FROM completed_on)=2017
GROUP BY completed_by_id
# Took 11.8s
使用YEAR:
SELECT count(*), completed_by_id FROM table
WHERE YEAR(completed_on)=2017
GROUP BY completed_by_id
# Took 5.15s
使用LIKE 'YEAR%'
SELECT count(*), completed_by_id FROM table
WHERE completed_on LIKE '2017%'
GROUP BY completed_by_id
# Took 6.61s
注意:在我自己的测试中,我发现YEAR() 是最快的,LIKE 是第二快的,EXTRACT() 是最慢的。
表中有大约 5M 行,completed_on 是已被索引的DATETIME 字段。
【问题讨论】:
-
您在
completed_on字段上确实有索引,对吧? -
@PM77-1 是的,有一个索引。
-
我们在谈论多少条记录?
-
@PM77-1 ~ 500 万
-
completed_on是什么列类型?
标签: mysql datetime database-performance query-performance