-1
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'
4

3 に答える 3

1

負荷は結合条件'<'から来ると思います。

クエリを分割するか(またはサブクエリが必要な場合)、カウントに名誉インデックスを使用することができます。

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;
于 2012-04-13T17:51:28.440 に答える
1

まず、group byクエリが意味をなすように句を追加する必要があります。

次に、ステータス列を変更して整数を保持し、インデックスを小さくする必要があります。

第三に、次のようにIDとステータスのインデックスを作成する必要があります。

alter table user_info add index idxID_Status (id, status)

最後に、ランクを取得するには、この回答を確認する必要があります。さらに、それらを注文する方法を追加する必要があります...注文なしでランクを取得することは実際にはランクではありません。

于 2012-04-13T17:03:43.937 に答える
1

説明からわかるように、MySQLはここで間違ったインデックスを使用しています。まず、すべてのインデックスを削除して、少なくとも次の2つのフィールドを含む新しいインデックスを作成します。IdおよびHonour。パフォーマンスが大幅に向上するはずです。

ALTER TABLE user_info ADD INDEX myIndex (id, honour);
于 2012-04-13T17:11:14.417 に答える