Mysql実験のexplainを用いてインデックスの行方を分析する

3666 ワード

概要
インデックスはmysqlの必須スキルであり、mysqlクエリーの効率を提供する手段でもあります.以下の実験で理解できますか?mysqlのインデックスルールは、sql文を絶えず最適化することもできます.
実験の目的
本実験は,組合せインデックスの最左原則を検証するためである.
説明
この実験は実際にインデックスを使用した結果を検証するためだけです.設計の妥当性を無視してください.
準備作業
1、ユーザー表一枚、uid、user_があるname,real_name,eamilなどのフィールド、詳細は建表文2、user_を参照nameフィールドの下に単純インデックスuser_を追加name,email,mobile,ageの3つのフィールドにインデックスcomplex_を追加index 3、テーブルエンジンはMyISAMを使用し、4を増やし、97000個のデータを準備する(具体的には実際の状況に応じてデータ量を決めることができ、ここでは97000+)5、実験ツールNavcat
テーブル文
DROP TABLE IF EXISTS `qz_users`;
CREATE TABLE `qz_users` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '    UID',
  `user_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '   ',
  `real_name` varchar(128) CHARACTER SET utf8 DEFAULT NULL COMMENT '    ',
  `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'EMAIL',
  `mobile` varchar(16) CHARACTER SET utf8 DEFAULT NULL COMMENT '    ',
  `password` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '    ',
  `salt` varchar(16) CHARACTER SET utf8 DEFAULT NULL COMMENT '       ',
  `avatar_file` varchar(128) CHARACTER SET utf8 DEFAULT NULL COMMENT '    ',
  `sex` tinyint(1) DEFAULT NULL COMMENT '  ',
  `birthday` int(10) DEFAULT NULL COMMENT '  ',
  PRIMARY KEY (`uid`),
  KEY `user_name` (`user_name`(250)),
  KEY `complex_index` (`email`,`mobile`,`sex`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

クエリ文の準備
explain select * from qz_users where user_name = "ryanhe";
explain select * from qz_users where email = "x";
explain select * from qz_users where email = "x" and mobile = "x" and sex=1;
explain select * from qz_users where email = "x" and mobile = "x";
explain select * from qz_users where email = "x" and sex = "x";
explain select * from qz_users where sex = "x" and mobile = "x";
explain select * from qz_users where  mobile = "x" and sex = "0";

結果分析
user_の使用name条件
 explain select * from qz_users where user_name= "x";

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
はい
user_name
1
メール条件の使用
 explain select * from qz_users where email = "x";

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
はい
complex_index
7
email+mobile+sex条件の使用
explain select * from qz_users where email = "x" and mobile = "x" and sex=1;

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
はい
complex_index
1
メール+mobile条件の使用
 explain select * from qz_users where email = "x" and mobile = "x";

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
はい
complex_index
7
email+sex条件の使用
 explain select * from qz_users where email = "x" and sex = "x";

結果
ぶんせき
][3]インデックスを取るかどうか
索引名
スキャンレコード数
はい
complex_index
7
sex+mobile条件の使用
 explain select * from qz_users where sex = "x" and mobile = "x";

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
いいえ
97185
Mobile+sex条件の使用
 explain select * from qz_users where  mobile = "18602199680" and sex = "0";

結果
ぶんせき
インデックスを移動するかどうか
索引名
スキャンレコード数
いいえ
97185
結論
以上の結果から,組合せインデックスを設定した後,クエリ条件を合理的に使用する順序はsql文の遅いクエリを回避できることが分かった.