私のテーブル構造は以下のようなものです:
CREATE TABLE test (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
field_1 VARCHAR(60) NOT NULL,
field_2 INT(10) UNSIGNED NULL,
field_3 INT(10) UNSIGNED NULL,
field_4 INT(10) UNSIGNED NULL,
field_5 CHAR(2) NULL,
field_6 INT(10) UNSIGNED NOT NULL,
rank TINYINT(2) NOT NULL DEFAULT '0',
status TINYINT(3) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX (status)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = MyISAM;
上記の表では、フィールドrank
とstatus
はそれぞれ 0 ~ 9 と 0 ~ 4 の間の整数値を持ちます。
現在、テーブルには約 950K のデータがあり、クエリを可能な限り最適化しようとしています。
基本的に、 field で降順の where 句を使用してフィールドを選択する必要がありますrank
。
たとえば、以下にいくつかの SQL クエリを示します。
SELECT field_1, field_2, field_3 FROM test WHERE field_1 = 'data1' && status IN ('0', '1', '2') ORDER BY rank DESC LIMIT 0, 20;
SELECT field_1, field_2, field_3 FROM test WHERE field_2 = '5' && status IN ('1', '2') ORDER BY rank DESC LIMIT 0, 20;
SELECT field_1, field_2, field_3 FROM test WHERE field_5 = 'US' && status IN ('0', '2') ORDER BY rank DESC LIMIT 0, 20;
上記のクエリORDER BY rank DESC
は非常に重要です。したがって、単一列または複数列にインデックスを追加する必要があるかどうかはかなり混乱しています。
誰かが私に最善の解決策を提案してくれませんか。