[英]Optimise & improve performance of this MYSQL query
SELECT u.id, u.honour, COUNT(*) + 1 AS rank
FROM user_info u
INNER JOIN user_info u2
ON u.honour < u2.honour
WHERE u.id = '$id'
AND u2.status = 'Alive'
AND u2.rank != '14'
該查詢當前正在使我的服務器速度減慢。 它根據您的榮譽計算出您在“ user_info”表中的排名,該表將其存儲在所有用戶中。
截圖說明。
http://cl.ly/370z0v2Y3v2X1t1r1k2A
SELECT u.id, u.honour, COUNT(*)+1 as rank
FROM user_info u
USE INDEX (prestigeOptimiser)
INNER JOIN user_info u2
ON u.honour < u2.honour
WHERE u.id='3'
AND u2.status='Alive'
AND u2.rank!='14'
首先,您應該添加一個group by
子句,以使查詢有意義。
其次,您應該更改狀態列以保留整數以減小索引。
第三,您應該像這樣在id和狀態上創建索引:
alter table user_info add index idxID_Status (id, status)
最后,要獲得排名,您應該看看這個答案 。 另外,您應該添加一種訂購方式……獲得沒有順序的排名並不是真正的排名。
從說明中可以看出,MySQL在這里使用了錯誤的索引。 首先,只需刪除所有索引並創建一個新索引,至少包含以下兩個字段: Id
和Honour
。 它應該大大提高性能。
ALTER TABLE user_info ADD INDEX myIndex (id, honour);
我認為負載來自您的加入條件“ <”。
您可以嘗試拆分查詢,或者(或者,如果您更喜歡子查詢)並使用honor索引進行計數。
SELECT id, honour INTO @uid, @uhonour
FROM user_info
WHERE id = '$id';
SELECT @uid, @uhonour, COUNT(honour) + 1 as rank
FROM user_info
WHERE status = 'Alive'
AND rank != '14'
AND @uhonour < honour;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.