table文の構築
CREATE TABLE IF NOT EXISTS `article` (
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) UNSIGNED NOT NULL,
`category_id` INT(10) UNSIGNED NOT NULL,
`views` INT(10) UNSIGNED NOT NULL,
`comments` INT(10) UNSIGNED NOT NULL,
`title` VARBINARY(255) NOT NULL,
`content` TEXT NOT NULL
);
INSERT INTO `article`(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'),
(2, 2, 2, 2, '2', '2'),
(1, 1, 3, 3, '3', '3');
クエリのインデックス
mysql> show index from article;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| article | 0 | PRIMARY | 1 | id | A | 3 | NULL | NULL | | BTREE | | |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
- テーブル
- NON_UNIQUE:非ユニークインデックス(0ユニークインデックス、非ユニークインデックス)
- KEY_NAME:インデックスの名前を表します
- Seq_in_index:このフィールドは、インデックス内の位置を示しているが、別のインデックス値は、変化の値、指標で定義された各フィールドのインデックスの組み合わせの順序で
- COLUMN_NAME:列名
- 照合:ルールの文字列
- カーディナリティ:ベース
- Sub_part:インデックスの長さを表し、
- ランチ:圧縮されたインデックスを作成するかどうかを(1、0およびデフォルト)
- ヌル:フィールドがnullになることができるかどうかを示します
- INDEX_TYPE:インデックスのタイプを示します
- コメント:コメント
- Index_comment:インデックスメモ
説明したSQLクエリ
mysql> explain select id, author_id from article where category_id = 1 and comments > 1 order by views DESC LIMIT 1;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
| 1 | SIMPLE | article | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | Using where; Using filesort |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)
- 私たちは余分なfilesortレコードを使用する(ソートではなく、テーブル内の順序インデックスに合わせて読ま外部インデックスを使用して)している、タイプはすべて(フルテーブルクエリ)で見ることができます。
- 最適化する必要がある、または大量のデータをより危険の後。
複合インデックスを作成します
mysql> create index idx_article_ccv on article(category_id,comments,views);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
表に示すインデックス
mysql> show index from article; +---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | article | 0 | PRIMARY | 1 | id | A | 3 | NULL | NULL | | BTREE | | | | article | 1 | idx_article_ccv | 1 | category_id | A | 2 | NULL | NULL | | BTREE | | | | article | 1 | idx_article_ccv | 2 | comments | A | 3 | NULL | NULL | | BTREE | | | | article | 1 | idx_article_ccv | 3 | views | A | 3 | NULL | NULL | | BTREE | | | +---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 4 rows in set (0.00 sec)
使用して、再度、SQLクエリを説明します
mysql> explain select id, author_id from article where category_id = 1 and comments > 1 order by views DESC LIMIT 1; +----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+---------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+---------------------------------------+ | 1 | SIMPLE | article | NULL | range | idx_article_ccv | idx_article_ccv | 8 | NULL | 1 | 100.00 | Using index condition; Using filesort | +----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+---------------------------------------+ 1 row in set, 1 warning (0.00 sec)
- これは、範囲内のすべてのタイプから見て、まだインデックス順に応じて、テーブルにインデックスではなく、読み取りをソートするために外に出ることができます。
- 故障のインデックスの原則:
- B +ツリーを使用
- まずソートCATEGORY_ID
- あなたは同じCATEGORY_IDが発生した場合は、ビューを並べ替え、同じコメントが発生した場合は、コメントを並べ替えます。
- コメントフィールドは、ジョイントインデックス内の中間位置にあるときに、ただしそれとコメント> 1ための値の範囲(範囲とも呼ばれます)
- MySQLは、検索のビュー部分の裏側に、再びインデックスを使用することはできません、フィールドインデックスの範囲の背後にあるクエリのタイプが無効です。
元のインデックスを削除し、新しいインデックスを構築
- インデックスの削除
drop index idx_article_ccv on article;
- (そうではないとして、インデックスの原因故障に、コメントの条件を回避するための余地がある)新しいインデックスを作成します。
create index idx_article_cv on article(category_id, views);
ビューインデックス再び
mysql> show index from article; +---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | article | 0 | PRIMARY | 1 | id | A | 3 | NULL | NULL | | BTREE | | | | article | 1 | idx_article_cv | 1 | category_id | A | 2 | NULL | NULL | | BTREE | | | | article | 1 | idx_article_cv | 2 | views | A | 3 | NULL | NULL | | BTREE | | | +---------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 3 rows in set (0.00 sec)
ビューは、SQL文を使用して再度説明します
explain select id, author_id from article where category_id = 1 and comments > 1 order by views DESC LIMIT 1; +----+-------------+---------+------------+------+----------------+----------------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+----------------+----------------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | article | NULL | ref | idx_article_cv | idx_article_cv | 4 | const | 2 | 33.33 | Using where | +----+-------------+---------+------------+------+----------------+----------------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec)
- あなたは、ファイルなくなって、余分なソート、タイプはREFになり見ることができます。