前言
索引对有一定开发经验的同学来说并不陌生,合理使用索引,能大大提升sql查询的性能,可以这么讲,随着业务数据量的不断增长,优化系统的响应速度,很大程度上可以说就是集中在索引的优化上;
mysql索引原理
在正式了解与学习mysql索引之前,先对mysql的索引原理再次回顾下;
我们知道,目前大多数使用的mysql引擎为 innodb,而innodb引擎使用的是 B+ Tree,下面通过几张图快速了解下 B+ Tree的结构,
假如存在下面这张表:
那么通过 B+ Tree构建出来的 “ 以ID为主键索引 ” 的树形结构如下:
说明:
- 叶子节点存放的是ID对应的一条完整的记录;
- 查找一条记录时,如果是按照ID搜索,则会采用类似二叉树的方式,最终定位到叶子节点的ID对应的那条记录;
也就是说,如果查询的时候,以ID为参数,则效率是最高的,反之,如果以非主键字段,建立索引,则B+Tree的索引结构将会如下,
说明:
- 主键索引构建出来的 B+Tree 结构保持不变;
- 再以主键ID之外的字段,构建出一个B+Tree结构,其叶子节点存储的是字段的值以及对应的主键值;
以上关于mysql 的inndb的索引结构原理先介绍到这儿,后文中将会用到里面的东西,还请留意;
mysql索引分类
MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等;
- 从 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引;
- 按照 物理实现方式 ,可以分为 2 种:聚簇索引和非聚簇索引;
- 按照 作用字段个数 进行划分,分成单列索引和联合索引;、
常规分类
- 主键索引,针对表的主键创建的索引,默认建表的时候,自动创建,有且只能有一个;
- 唯一索引,为了避免一个表中的某列数据出现重复的值,可以有多个,关键字:UNIQUE;
- 常规索引,用于快速定位特定字段的数据,可以有多个;
- 全文索引,全文索引常用于查找文本中的关键词,而不是比较索引中的值,可以有多个,关键字FULLTEXT;
补充说明
不同的存储引擎支持的索引类型也不一样
- InnoDB :支持 B-tree、Full-text 等索引,不支持 Hash索引;
- MyISAM : 支持 B-tree、Full-text 等索引,不支持 Hash 索引;
- Memory :支持 B-tree、Hash 等索引,不支持 Full-text 索引;
- NDB :支持 Hash 索引,不支持 B-tree、Full-text 等索引;
- Archive :不支持 B-tree、Hash、Full-text 等索引;
索引创建语法
数据准备,有如下建表sql
CREATE TABLE `user` (
`user_id` VARCHAR (32) NOT NULL COMMENT '用户ID',
`user_name` VARCHAR (64) DEFAULT NULL COMMENT '用户姓名',
`passwd` VARCHAR (64) NOT NULL COMMENT '密码',
`email` VARCHAR (64) DEFAULT NULL COMMENT '邮箱',
`mobile` VARCHAR (32) DEFAULT NULL COMMENT '手机号',
`address` VARCHAR (128) DEFAULT NULL COMMENT '地址'