mysqlパフォーマンスチューニング3-インデックス関連
3013 ワード
注:オリジナル作品、転載は出典を明記してください.
インデックスはクエリーの速度を速めることはよく知られていますが、インデックスに注意しないと失効することがあります.本博文は実例を結びつけて徹底的にインデックスを研究する.
前提条件:
効果を表すために、本人のブログ「mysqlパフォーマンスチューニング1」のブログでSupanテーブルに7000万データを挿入してください.注意innodb_の設定flush_log_at_trx_commit=2、そうでなければ7000万のデータを挿入し、4時間ほどかかります.
例1:プレゼンテーションインデックスの通知クエリー
優先的にsupanテーブルのgradeフィールドインデックスを作成しないでgradeフィールドのクエリーを行います.
時間:9.17秒
gradeフィールドのインデックスを作成するには、次の手順に従います.
再照会
インデックス作成後、わずか0.09秒で9.17/0.09倍の効率化
二:インデックスフィールドで式で無効になります.
9.11時間を費やして、また遠い昔に戻って、ほほほ.上のsqlは、実際には下の高効率sqlに完全に変更できます.
3:mysqlのインデックスフィールドに集約関数を使用し、インデックスは失効しません.Oracleの失効(注意)
四:索引が挿入に与える影響
インデックスがあるときにレコードを挿入
索引の削除
データの再挿入
2回の挿入の時間の分析から、インデックスの時にデータを挿入することができて、効率は比較的に低いので、いつも挿入して、更新する表の中で、できるだけインデックスを使わないでください.
インデックスはクエリーの速度を速めることはよく知られていますが、インデックスに注意しないと失効することがあります.本博文は実例を結びつけて徹底的にインデックスを研究する.
前提条件:
効果を表すために、本人のブログ「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回の挿入の時間の分析から、インデックスの時にデータを挿入することができて、効率は比較的に低いので、いつも挿入して、更新する表の中で、できるだけインデックスを使わないでください.