私はINNODBテーブルを持っていますlevels
:
+--------------------+------+------+-----+ ------+-------+ | | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ | +--------------------+------+------+-----+ ------+-------+ | | ID | int(9) | いいえ | PRI | ヌル | | | | | レベル名 | varchar(20) | いいえ | | | ヌル | | | | | ユーザー ID | int(10) | いいえ | | | ヌル | | | | | ユーザー名 | varchar(45) | いいえ | | | ヌル | | | | | 評価 | 10 進数 (5,4) | いいえ | | | 0.0000 | | | | | 投票 | int(5) | いいえ | | | 0 | | | | | 再生 | int(5) | いいえ | | | 0 | | | | | date_published | 日付 | いいえ | マル | ヌル | | | | | ユーザーコメント | varchar(255) | いいえ | | | ヌル | | | | | playable_character | int(2) | いいえ | | | 1 | | | | | 特集されています | tinyint(1) | いいえ | マル | 0 | | | +--------------------+------+------+-----+ ------+-------+
約 400 万行あります。フロントエンド機能のため、さまざまなフィルターと並べ替えを使用してこのテーブルをクエリする必要があります。それらは、、、、playable_character
およびにありrating
ます。過去の日、週、月、またはいつでも (過去 3 年間) 表示するようにフィルター処理できます。ページングもあります。したがって、ユーザーの選択に応じて、クエリは次のいずれかのようになります。plays
date_published
date_published
SELECT * FROM levels
WHERE playable_character = 0 AND
date_published BETWEEN date_sub(now(), INTERVAL 3 YEAR) AND now()
ORDER BY date_published DESC
LIMIT 0, 1000;
SELECT * FROM levels
WHERE playable_character = 4 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 WEEK) AND now()
ORDER BY rating DESC
LIMIT 4000, 1000;
SELECT * FROM levels
WHERE playable_character = 5 AND
date_published BETWEEN date_sub(now(), INTERVAL 1 MONTH) AND now()
ORDER BY plays DESC
LIMIT 1000, 1000;
ここでの最初の例のクエリでidx_date_char(date_published, playable_character)
うまく機能するインデックスから始めました。date_published
基本的には. EXPLAIN を使用すると、'using index condition' が得られます。これは良いことです。同じ 2 つのインデックス付きの列が WHERE 句と ORDER BY 句に存在するため、インデックスが機能する理由を理解していると思います。
plays
私の問題は、またはで注文するクエリにありrating
ます。3 番目の列を紹介していることは理解していますが、私の人生では、考えられるほぼすべてのバリエーションを試しても、うまく機能するインデックスを取得することはできません。すぐ。たぶん、クエリは別の方法で記述できますか?
私はそれを追加する必要がrating
ありplays
、常に として照会されDESC
ます。または のいずれかのみdate_published
が可能です。DESC
ASC
どんな提案でも大歓迎です。ティア。