我正在構建一個動態的MySQL用戶搜索查詢,以便能夠處理許多不同的搜索條件。我考慮編寫一個存儲過程,但最終在客戶端建立了查詢(在PHP中準備好的語句)。其中的標準是能夠搜索用戶的年齡,即在X歲和Y歲之間。我想知道如何儘可能有效地做到這一點。最終查詢將相當複雜,並且有多個連接,並且可能在未來將在幾百萬行上運行,所以我需要在可能的地方優化它。我將用戶的出生日期存儲在索引爲DATE
的列中,格式爲YYYY-MM-DD
。我有以下的用戶定義函數(UDF)用於計算用戶的年齡:SQL查詢中的年齡計算性能
RETURN (DATE_FORMAT(current_time, '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(current_time, '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')));
計算的細節並不重要;我更關心它是如何使用的。我擔心的一個問題是,在我的WHERE子句中使用這個UDF會顯着降低查詢速度,因爲它需要在每一行上運行,即使我使UDF具有確定性。我無法保證在檢查年齡之前會有其他標準來縮小匹配的行數。我不能僅僅根據日期檢查出生日期,因爲那樣做不準確。我在考慮是否將上面的計算從UDF中拉出來,並將其直接嵌入到查詢的WHERE子句中會產生顯着的差異(我認爲是)。不利的一面是,WHERE子句通過這樣的計算進一步複雜化(或者實際上是兩個,除非有重用結果的方法)。但我想沒有辦法避免這些計算。在WHERE子句中執行這種計算是關於性能的方式,還是有更好的方法?
從理論上講,我想我甚至可以在user
表中添加一個age
列和計算時代,當一個用戶註冊和運行計劃工作/的cronjob每天晚上更新爲今天的生日用戶的年齡(如果我可以有效地選擇)。這肯定會加快我的搜索查詢,但會引入冗餘數據。因此,如果計算無法在搜索查詢本身內有效完成,我真的只想這樣做。
因此,總結一下:我需要搜索一系列年齡範圍內的用戶(例如25到30歲)。我應該在WHERE子句中計算年齡,還是會因爲必須在每一行都做得很慢?這是我必須作出的犧牲,還是我有更好的選擇?
任何幫助,非常感謝。
謝謝你的答案。例如,對於這個年齡段,25歲半的人仍應該與查詢20-25歲的人相匹配。所以我不會從今天的日期減去25年來尋找,但希望能夠匹配那些25歲但還未26歲的人。我希望這是有道理的,如果我不清楚這一點,我很抱歉。你知道如何做到這一點?這也是爲什麼我沒有采用間隔方法。我使用的功能只是我在某處找到的一個功能,知道轉換不是很好的做法。我會像你說的那樣更新它。 – Andy0708
計算他們的DOB必須達到的標準而不是計算他們當前的年齡肯定是要走的路。 –