mysqlパフォーマンスチューニング3-インデックス関連

3013 ワード

注:オリジナル作品、転載は出典を明記してください.
インデックスはクエリーの速度を速めることはよく知られていますが、インデックスに注意しないと失効することがあります.本博文は実例を結びつけて徹底的にインデックスを研究する.
前提条件:
効果を表すために、本人のブログ「mysqlパフォーマンスチューニング1」のブログでSupanテーブルに7000万データを挿入してください.注意innodb_の設定flush_log_at_trx_commit=2、そうでなければ7000万のデータを挿入し、4時間ほどかかります.
例1:プレゼンテーションインデックスの通知クエリー
優先的にsupanテーブルのgradeフィールドインデックスを作成しないでgradeフィールドのクエリーを行います.
mysql> select * from supan where grade = 1515215;
+--------+---------+---------+
| name   | id      | grade   |
+--------+---------+---------+
|       | 4535219 | 1515215 |
+--------+---------+---------+
1 row in set ([color=blue]9.17 [/color]sec)

時間:9.17秒
gradeフィールドのインデックスを作成するには、次の手順に従います.
mysql> create index index_supan_grade on supan(grade);
Query OK, 0 rows affected (1 min 17.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

再照会
mysql> select * from supan where grade = 1515215;
+--------+---------+---------+
| name   | id      | grade   |
+--------+---------+---------+
|       | 4535219 | 1515215 |
+--------+---------+---------+
1 row in set (0.09 sec)

インデックス作成後、わずか0.09秒で9.17/0.09倍の効率化
二:インデックスフィールドで式で無効になります.
mysql> select * from supan where grade*10 = 256450;
+--------+---------+-------+
| name   | id      | grade |
+--------+---------+-------+
|       | 1045649 | 25645 |
|       | 2045649 | 25645 |
|       | 3045649 | 25645 |
+--------+---------+-------+
3 rows in set (9.11 sec)

9.11時間を費やして、また遠い昔に戻って、ほほほ.上のsqlは、実際には下の高効率sqlに完全に変更できます.
mysql> select * from supan where grade = 256450;
+--------+---------+--------+
| name   | id      | grade  |
+--------+---------+--------+
|       | 1276454 | 256450 |
|       | 2276454 | 256450 |
|       | 3276454 | 256450 |
+--------+---------+--------+
3 rows in set (0.11 sec)
机能はまったく同じですが、効率は天と地です.その中であなたは知っています.
3:mysqlのインデックスフィールドに集約関数を使用し、インデックスは失効しません.Oracleの失効(注意)
mysql> select max(grade) from supan;
+------------+
| max(grade) |
+------------+
|    5792149 |
+------------+
1 row in set (0.00 sec)

四:索引が挿入に与える影響
インデックスがあるときにレコードを挿入
mysql> insert into supan(name,grade) values('chenchaoyang',100);
Query OK, 1 row affected (0.09 sec)

索引の削除
mysql> drop index index_supan_grade on supan;
Query OK, 0 rows affected (0.55 sec)
Records: 0  Duplicates: 0  Warnings: 0

データの再挿入
mysql> insert into supan(name,grade) values('chenchaoyang',100);
Query OK, 1 row affected (0.04 sec)

2回の挿入の時間の分析から、インデックスの時にデータを挿入することができて、効率は比較的に低いので、いつも挿入して、更新する表の中で、できるだけインデックスを使わないでください.