mysql有哪些索引:分类与选用方案

mysql有哪些索引,主流分为主键索引、普通索引、唯一索引、联合索引、全文索引、空间索引,InnoDB引擎下主键索引是聚簇索引,其余属于二级索引,聚簇索引数据和索引放在一起,查询主键速度更快,二级索引只存储主键值,回表拿到完整数据,联合索引遵循最左前缀原则,适合多字段条件查询,全文索引用于长文本关键词检索,空间索引适配地理坐标数据,MyISAM引擎所有索引都为非聚簇索引,该索引体系适用于mysql5.7、mysql8.0稳定版本,内存表不支持全文索引和空间索引,你做单字段等值查询优先普通索引,字段值不能重复时选用唯一索引,主键字段默认自带主键索引,不要重复创建。

mysql索引的基础类型

主键索引绑定主键字段,一张InnoDB表只能有一个主键索引,字段值不能为空、不能重复,它就是聚簇索引,表的数据会按照主键有序存放,直接通过主键检索不需要回表,你建表时设置primarykey就会自动生成主键索引,不要选择频繁更新的字段作为主键,主键频繁修改会引发整行数据移动,带来额外开销。

普通索引是最通用的索引类型,没有唯一性约束,允许字段为空和重复值,仅用来加快等值查询、范围查询,用createindex语句就可以创建,适合大部分没有唯一性要求的查询字段,比如商品名称、用户昵称这类重复概率较高的字段。

唯一索引要求索引字段的值不能重复,允许存在一个null值,它和主键索引的区别是一张表可以创建多个唯一索引,唯一索引检索时会做唯一性校验,写入速度相比普通索引会略慢,适合手机号、身份证号这类业务上天然唯一,但不适合做主键的字段。

mysql复合与特殊索引

联合索引,也叫复合索引,由两个或多个字段共同组成,索引结构按照字段定义顺序排序,最左前缀原则是它的核心,查询条件必须匹配索引最左侧的连续字段,索引才能生效,你定义(a,b,c)联合索引,wherea=?、wherea=?andb=?、wherea=?andb=?andc=?都可以走索引,只写whereb=?无法触发索引,设计时把区分度高、查询频率高的字段放在靠前位置。

全文索引针对text、varchar长文本字段,用来快速匹配词语,不适合模糊like%关键词%查询,mysql8.0支持ngram分词,适配中文场景,单表最多创建一个全文索引,数据量大、频繁新增修改时,全文索引维护成本会明显上升,短文本检索优先普通索引。

空间索引针对geometry地理类型字段,用来处理坐标、多边形等空间范围查询,需要开启对应的空间函数,日常业务使用占比偏低,只有地图、点位范围筛选场景才会用到。

索引类型唯一性是否允许null典型适用场景
主键索引唯一不允许表主键,主键查询
唯一索引唯一允许单个null手机号、唯一业务编号
普通索引不唯一允许常规等值、范围查询
联合索引由字段组合决定由字段定义决定多字段组合查询
全文索引不唯一允许长文本关键词检索
空间索引不唯一允许地理坐标范围查询

索引不是越多越好。

每新增一条索引,写入、更新、删除操作都要同步维护索引结构,会拖慢写操作速度,单表索引数量建议控制在合适区间,不要给低频查询、低区分度字段建立索引,比如性别字段只有两个固定值,索引基本无法提升查询效率,还会增加存储和写入负担。

聚簇索引的形态只存在于InnoDB引擎,InnoDB也是mysql生产环境使用较多的存储引擎,切换到MyISAM之后,所有索引都变成非聚簇索引,索引和真实数据分开存放,主键查询同样需要二次查找,你在业务开发时优先选定InnoDB引擎,再规划索引结构。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于mysql有哪些索引的文章欢迎访问:百科