簡體   English   中英

優化和提高此MYSQL查詢的性能

[英]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在這里使用了錯誤的索引。 首先,只需刪除所有索引並創建一個新索引,至少包含以下兩個字段: IdHonour 它應該大大提高性能。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM