私は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 年間) 表示するようにフィルター処理できます。ページングもあります。したがって、ユーザーの選択に応じて、クエリは次のいずれかのようになります。playsdate_publisheddate_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が可能です。DESCASC
どんな提案でも大歓迎です。ティア。