我使用的是CodeIgniter 2,在我的數據庫模型中,我有一個查詢連接兩個表並根據距給定地理位置的距離過濾行。切割MySQL中的SELECT查詢時間
SELECT users.id,
(3959 * acos(cos(radians(42.327612)) *
cos(radians(last_seen.lat)) * cos(radians(last_seen.lon) -
radians(-77.661591)) + sin(radians(42.327612)) *
sin(radians(last_seen.lat)))) AS distance
FROM users
JOIN last_seen ON users.id = last_seen.seen_id
WHERE users.age >= 18 AND users.age <= 30
HAVING distance < 50
我不確定是否distance
這使得這個查詢需要特別長的時間。我的users table
中有超過300,000行。我的last_seen
表中的金額相同。我相信這會起到一定的作用。
但是,users表中的age
列與id
列一起編入索引。 last_seen
表中的lat
和lon
列也被編入索引。
有沒有人有任何想法,爲什麼這個查詢需要這麼長時間,我可以改善它?
UPDATE
事實證明,這個查詢實際運行很快。當我在PHPMyAdmin中執行這個查詢時,它需要0.56秒。不錯。但是,當我嘗試使用第三方SQL客戶端(如SequelPro)執行此查詢時,它至少需要20秒,並且我的Mac上的所有其他應用程序都會變慢。當通過jQuery的load()
方法加載腳本來執行查詢時,需要大約相同的時間。
在Google Chrome開發人員工具中查看我的網絡標籤後,似乎加載時間很長的原因是因爲所謂的TTFB
或Time To First Byte。這是永恆的。
添加'explain select ...'的輸出 –
lat和long的索引不會幫助,因爲您在過濾之前對它們進行了計算。 – Barmar
是否對'last_seen.seen_id'建立了索引? –