この質問は、MySQL データベースでのインデックス作成に関する幅広い問題に対する一般的な回答を期待しています。
このテーブルの例を見てみましょう:
CREATE TABLE IF NOT EXISTS `article` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`published` tinyint(1) NOT NULL DEFAULT '0',
`author_id` int(11) unsigned NOT NULL,
`modificator_id` int(11) unsigned DEFAULT NULL,
`category_id` int(11) unsigned DEFAULT NULL,
`title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`headline` text COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`url_alias` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`priority` mediumint(11) unsigned NOT NULL DEFAULT '50',
`publication_date` datetime NOT NULL,
`creation_date` datetime NOT NULL,
`modification_date` datetime NOT NULL,
PRIMARY KEY (`id`)
);
このようなサンプルには、さまざまな基準で実行できるさまざまなクエリがあります。
- カテゴリ ID
- 公開された
- 出版日
例えば:
SELECT id FROM article WHERE NOT published AND category_id = '2' ORDER BY publication_date;
多くのテーブルでは、さまざまな状態フィールド (ここで公開されているものなど)、日付フィールド、または参照フィールド (author_id や category_id など) を確認できます。インデックスを作成するには、どの戦略を選択する必要がありますか?
これは、次の点で開発できます。
- テーブルごとに多くのインデックスが作成される可能性がある場合でも、クエリで使用できるすべてのフィールドにインデックスを作成します (where 引数または order by として)。
- また、ブール値や列挙型などの小さな値セットのみを持つフィールドにインデックスを作成します。これにより、スキャンのスコープサイズが1倍縮小されます(nが入力の数であり、すべての値が均一に使用されると仮定します)?
- 5.0 より前の MySQL では、リクエストごとに 1 つのインデックスしか使用されていなかったと読みましたが、システムはどのようにインデックスを選択するのでしょうか? (より制限的なものを選択することによって?)
- OR ステートメントはどのように処理されますか?
- これにより挿入がどのくらい遅くなりますか?
- InnoDB/MyISAM はこの問題に何か変更を加えますか?
リクエストが最適化されているかどうかを知るために EXPLAIN ステートメントを使用できることは知っていますが、純粋に経験的なアプローチよりも、少し具体的な理論的なものの方が実際には建設的です。