我想比較我的演算法,這里是我的案例的一些簡化,假設表是使用 log_timestamp 列索引的。
第一個查詢:
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
第二個查詢:
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
上面兩個查詢中哪個會更快,為什么?
uj5u.com熱心網友回復:
你問的問題應該是兩個獨立的問題。第一個,沿著你上面問的,是兩個查詢中哪個現在更快。第二個問題,也是真正需要考慮的問題,是如何調整這兩個查詢以使其更快,哪個是最快的。
事實證明,只有第二個查詢可以使用索引:
SELECT name
FROM user_table
WHERE log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR) AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
此查詢應受益于 上的索引(log_timestamp, name)。請注意,您的第一個查詢不能真正從任何索引中受益,因此我希望在創建正確的索引后,您的第二個查詢會快得多。
uj5u.com熱心網友回復:
要了解查詢如何快速或慢速運行,我們必須知道表中有多少條記錄。
如果記錄數仍然在 100 - 1000 之間(取決于表中的欄位數),則在執行兩個查詢時,兩者將幾乎同時顯示結果。
如果記錄數超過 100,000,它會開始看到顯示結果的時間差。
請記住,不要忘記使用EXPLAIN函式來查看查詢的進行情況。
讓我們分析這兩個查詢
第一個查詢
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
MySQL 將:
- 在不使用索引的情況下通過表中的所有記錄執行此DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR))操作,
- 之后 MySQL 將與>= DATE('2018-01-01') 進行比較
- 在不使用索引的情況下通過表中的所有記錄執行此DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR))操作,
- 之后 MySQL 將與< DATE('2019-01-01');進行比較。
- 并顯示結果 注意: 假設表中有 100,000 條記錄,顯示結果需要時間
第二次查詢
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
MySQL 將:
- 通過索引比較log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR),而不是全掃描表
- 并比較log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR); 通過索引,而不是全掃描表
- 并顯示結果
注意事項:
- 記住!!!...表中的索引,就像書中的索引一樣。當您想閱讀超過 1000 頁的書時,您將首先看到索引以找到您要查找的頁面。您不會閱讀所有頁面,以找到您想要閱讀的主題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342388.html
