MYSQL sql語句針對數據記錄時間範圍查詢的效率對比

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, 或者 >, < 的在一個時間範圍類的方式,這樣可以有效利用索引。其他方式會使查詢索引失效。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章