MYsql 針對where條件時間範圍的查詢效率方式對比
end_rec表,遊戲記錄表 時間字段 time_str 表示每局遊戲結束時間,已經針對 time_str加了 B-tree 索引,一共68w條數據
需求:
查詢今日的組局數量
1,方式一,用 TO_DAYS() 函數
select count(*) from end_rec where TO_DAYS(time_str) = TO_DAYS(NOW());
耗時 0.15 sec
2,方式二,用date_format 函數
select count(*) from end_rec where date_format(time_str,'%Y%m%d')='20200229';
耗時0.27sec
3, 方式三,用 > < 查詢當天時間範圍
select count(*) from end_rec where time_str >= '2020-02-29' AND time_str <='2020-03-01';
耗時0.02 sec 查詢非常快
4,方式四,用 SUBSTING函數
select count(*) from end_rec where SUBSTRING(time_str,1,10)='2020-02-29';
耗時 0.22秒基本和方式二差不多。
5,方式五,用 between and 語句
耗時0.02秒,非常快。 發現 between and 語句非常高效 和 方式3一樣。
6,方式六, 用UNIX_TIMESTAMP轉換時間字符串爲時間戳後查詢。
2020-02-29 時間戳對應 1582904600
2020-03-01 時間戳對應 1582992000;
SQL語句:
select count(*) from end_rec where UNIX_TIMESTAMP(time_str) > 1582904600 AND UNIX_TIMESTAMP(time_str) < 1582992000;
耗時達到了驚人的 0.99,是方式3和方式5的接近一百倍。這個方式是性能最差的查詢方案。
總結,對有關時間範圍的SQL查詢,最好使用between AND, 或者 >, < 的在一個時間範圍類的方式,這樣可以有效利用索引。其他方式會使查詢索引失效。