最適化を求める複雑なクエリを含むテーブルがあり、MySQL のインデックス作成に関するほとんどのドキュメントを読みましたが、この場合はどうすればよいかわかりません。
データ構造:
-- please, don't comment on the field types and names, it is outsourced project.
CREATE TABLE items(
record_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
solid CHAR(1) NOT NULL, -- only 'Y','N' values
optional CHAR(1) NULL, -- only 'Y','N', NULL values
data TEXT
);
クエリ:
SELECT * FROM items
WHERE record_id != 88
AND solid = 'Y'
AND optional !='N' -- 'Y' OR NULL
もちろん、追加の結合と関連データがありますが、これが最大のフィルターです。
シナリオ:
- 200 000+ レコード、
- 10% (すべてから) solid
= 'Y'、
- 10% (すべてから) optional
!='N'、
このクエリに適したインデックスは何ですか?
またはより正確には:
最初のチェック レコード != 88 は何らかの方法でクエリを遅くしますか?
(それは1つの結果だけを排除します...?)どちらが速いか (
optional
!='N') または ( 'optional' = 'Y' OR 'optional' is NULL )
上記のoptional
= 'N' は合計数の 10% です。可能な値が 2 つしかない CHAR(1) 列にインデックスを付けるのに特別なことはありますか?
このインデックス (record_id、solid、オプション) を使用できますか?
特定の値 (ソリッド = 'Y'、オプション !='N') のインデックスを作成できますか?
@Jack が要求したとおり、現在のEXPLAIN結果 (合計 30 000 行のうち 20 件の結果):
+-------------+-------+--------------+---------+-- -------+------+-------+-------------+ | | select_type | タイプ | 可能な_キー | キー | key_len | 参照 | 行 | 行 エクストラ | +-------------+-------+--------------+---------+-- -------+------+-------+-------------+ | | プライマリ | 範囲 | プライマリ | プライマリ | 4 | ヌル | 16228 | where | の使用 +-------------+-------+--------------+---------+-- -------+------+-------+-------------+