Loading... # [MySQL索引类型(type)分析](https://blog.csdn.net/m0_37062111/article/details/129199571) ## type索引类型 > system > const > eq_ref > ref > range > index > all 优化级别从左往右递减,没有索引的⼀般为’all’。 **推荐优化目标:至少要达到 range 级别, 要求是 ref 级别, 如果可以是 const 最好** ;index比all更优,但是并不明显,性能都很差。 ## Type级别说明 ### 1、system级别 只有一条数据的系统表; 或衍生表只能有一条数据的主查询; 这是const类型的特列,实际开发中难以达到(基本不会出现)。 ### 2、const级别 当使用 **主键** 或 **唯一索引** 进行等值查询时 实例 表结构 ```mysql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user_name_IDX` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ``` **Primary key** ```mysql explain select * from `user` u where id=1 ``` **unique索引** ```mysql explain select * from `user` u where name='zhangsan' ``` ### 3、eq_ref级别 当联表查询的关联字段为唯一索引或者主键时 实例 表结构 ```mysql CREATE TABLE `user_job` ( `id` int(11) NOT NULL, `userId` int(11) NOT NULL, `job` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE, KEY `user_job_userId_IDX` (`userId`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ``` 数据 输出结果 ```mysql explain select uj.id ,u.name ,uj.job from user_job uj left join `user` u on uj.userId =u.id ``` ### 4、ref级别 当联表查询的关联字段或者单表查询的筛选字段为普通索引时 实例 表结构 ```mysql CREATE TABLE `user_job` ( `id` int(11) NOT NULL, `userId` int(11) NOT NULL, `job` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) USING BTREE, KEY `user_job_userId_IDX` (`userId`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ``` 输出结果 ```mysql explain select * from user_job uj where name ='xx' ``` ### 5、range级别 使用主键或者索引,进行范围查询时 常用范围查询 (between , in , > , < , >=),in有时会失效为ALL 实例 表结构 ```mysql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `user_name_IDX` (`name`) USING BTREE, KEY `user_age_IDX` (`age`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ``` 输出结果 ```mysql explain select * from `user` u where id>1 ``` ```mysql explain select * from `user` u where name in('zhangsan','lisi') ``` ```mysql explain select * from `user` u where age BETWEEN 10 and 20 ``` ### 6、index级别 遍历索引树,把索引的数据全部查出来 ```mysql explain select id,name from `user` u ``` ```mysql explain select age from `user` u ``` ### 7、ALL级别 当不使用任何索引和主键时,进行全表扫描 ```mysql explain select * from `user` u ``` 最后修改:2023 年 12 月 25 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏