目录
1.索引的概念
2.索引的优缺点
3.索引的数据结构
4.索引结构
1.二叉树:
编辑2.红黑树:
3.BTree(B-Tree):
编辑4.传统B+Tree:
编辑5.MySQL中的B+Tree:
编辑6.Hash:
5.为什么InnoDB选择使用B+Tree
1.相对于二叉树
2.相对于B-Tree
3.相对于Hash索引
6.索引分类:
7.在InnoDB存储引擎中,按照索引的存储形式,索引分为
1.聚集索引,Clustered Index:
2.二级索引,Secondary Index(也叫做辅助索引):
编辑3. 聚集索引的选取规则
4.聚集索引和二级索引的区别:
5.回表查询:
编辑8.InnoDB主键索引的B+Tree高度
9.索引语法
10.SQL性能分析工具
1.SQL执行频率
2.慢查询日志:
3.profile详情:
4.explain执行计划:
5.explain的各字段含义:
11.索引使用原则
1.最左匹配原则:
2.范围查询:
3.索引列运算
4.字符串:
5.模糊查询
6.or连接的原则
7.数据分布影响
8.SQL提示
9.覆盖索引
10.前缀索引
11.单列索引和联合索引
12.索引的设计原则
1.索引的概念
索引index是帮助MySQL高效获取数据的数据结构(有序)
2.索引的优缺点
优点:高效查询数据;索引能够对数据进行排序
缺点:索引要占用空间;数据增删改查后也要更新索引,降低更新表的速度
3.索引的数据结构
MySQL索引是在存储引擎层实现的,不同存储引擎结构不同
主要结构:B+Tree(最常见)、Hash索引(不支持范围查询)
4.索引结构
1.二叉树:
顺序插入时,形成链表,查询性能降低;数据量大时,检索速度慢
2.红黑树:
解决树的平衡问题,但数据量过大时,层级较深,搜索速度慢
3.BTree(B-Tree):
有最大度数,树的度数指一个节点的最大子节点个数,最大度数为n,则最多有n个子节点,最多有n-1个key,n个指针
* 根结点和叶子结点中,存储着key和相对应的数据
* 当存储的key的个数达到n-1后会使用 中间元素向上分裂 的方法,如果向上分裂也使得key达到了n-1个,则继续使用 中间元素向上分裂
4.传统B+Tree:
* 所有的元素都会出现在叶子结点;
* 分叶子结点只起到索引作用,叶子结点用来存放数据,并且叶子结点之间还形成了单向链表,每一个结点都会通过指针指向下一个元素
* 存储的key个数达到n-1后使用 中间元素向上分裂方法,但此时该元素仍会出现在叶子结点,并且叶子结点形成了单向链表,非叶子结点只是起到索引的作用
5.MySQL中的B+Tree:
增加了一个指向相邻叶子结点的链表指针(相邻变为双向链表),形成了带有顺序指针的B+Tree
6.Hash:
采用hash算法,将键值换算为新的hash值,映射到对应槽位,存储在hash表中
* 只能用于等值比较,不支持范围查询
* 无法利用索引完成排序操作
* 查询效率高,通常只需要进行一次检索,效率通常高于B+Tree索引
5.为什么InnoDB选择使用B+Tree
1.相对于二叉树
层级更少,搜索效率高
2.相对于B-Tree
B-Tree的叶子结点和非叶子结点都会存储数据,索引和数据存储在页/块中,页的大小只有16k,若存放了数据则能存放的指针就少了,若数据过多,只能通过提高树的层级来存放指针,导致性能降低
3.相对于Hash索引
无法支持范围匹配
6.索引分类:
主键索引:针对表中主键创建的索引,primary(只能有一个)
唯一索引:避免同一个表中某数据列中的值重复,unique
常规索引:快速定位特定数据
全文索引:全文索引查找文本中的关键词,fulltext
7.在InnoDB存储引擎中,按照索引的存储形式,索引分为
1.聚集索引,Clustered Index:
将数据存储和索引放在一起,索引结构的叶子节点保存了行数据;必须有且只有一个,否则无法存放行数据
2.二级索引,Secondary Index(也叫做辅助索引):
将数据和索引分开存储,索引结构的叶子结点关联的是对应主键;可以存在多个
3. 聚集索引的选取规则
* 若存在主键,主键索引就是聚集索引
* 若不存在主键,使用第一个唯一索引作为聚集索引
* 若没有主键,也没有合适的唯一索引,InnoDB会自动生成一个rowid作为隐藏的聚集索引
4.聚集索引和二级索引的区别:
聚集索引的叶子结点下面是这一行的数据,二级索引叶子结点下面是对应的主键
5.回表查询:
先通过二级索引寻找到对应的主键值,然后根据主键值到聚集索引中查询相应的行数据
8.InnoDB主键索引的B+Tree高度
InnoDB的B+Tree高度为3的情况下就能够存储两千多万条数据(主键使用Bigint,占用8字节的情况下)
9.索引语法
创建索引
CREATE[ UNIOUE|FULLTEXT] INDEX INDEX NAME ON TABLE NAME (INDEX col NAME,... ) ;
查看索引
SHOW INDEX FROM TABLE_NAME :
删除索引
DROP INDEX INDEX NAME ON TABLE_NAME ;
10.SQL性能分析工具
1.SQL执行频率
以增删改为主的表,则优化比重小;以查询为主的表,需要优化
* 用
SHOW GLOBAL/SESSION STATUS 'Com_'
查询当前表的增删改查的频率
2.慢查询日志:
记录所有执行时间超过指定参数long_query_time(默认10s)的所有SQL语句的日志
* 慢查询日志默认没有开启
* 使用show variables like ‘slow_query_log’查询是否开启了慢查询日志
SHOW VARIABLES LIKE 'slow_query_log';
* 开启慢查询日志:在MySQL配置文件中配置
3.profile详情:
能够了解每一条SQL语句执行情况,比如消耗时长
* 默认关闭,使用set profiling=1,设置开启
* 使用show profiles,查看执行情况
show profiles;
4.explain执行计划:
通过explain能够回去MySQL执行查询语句的具体信息,包括select语句执行过程中表如何连接以及连接的顺序
EXPLAIN SELECT goods_name FROM t_goods;
5.explain的各字段含义:
* id:select查询的序列号,代表查询中执行select或者操作表的顺序;ID相同,执行顺序从上到下;ID不同,值越大,越先执行
* select_type:select的查询类型
* type:连接类型,性能优好到差的连接类型:Null、system、const、eq_ref、ref、range、index、all
* possible_key:显示可能应用在这张表的索引,一个或者多个
* key:实际使用的索引,为null则没有使用索引
* key_len:使用到的索引的字节数,长度越短越好
* rows:执行查询的行数,是一个估计值,并不总是准确的
* filtered:表示返回结果的行数占需要读取行数的百分比,filtered值越大越好
11.索引使用原则
1.最左匹配原则:
联合索引的查询会从索引的最左列开始,不跳过索引中的列,若跳过了某一列,则后面的字段索引都会失效
2.范围查询:
联合索引中,出现返回查询大于或小于,则范围查询右侧的列索引实效
* 解决方法,尽可能使用大于等于或小于等于,不会出现这种问题
3.索引列运算
* 若在索引列上进行运算操作,索引会失效(比如截取字符串)
4.字符串:
字符串不加引号,索引将失效
5.模糊查询
* 若只有尾部模糊匹配,索引不会失效;若头部模糊匹配,索引失效
6.or连接的原则
* 用or分开的条件,若or前条件的列有索引,or后面的列没有索引,则涉及的索引都不会用到
* 只有or两侧都有索引,索引才会生效
7.数据分布影响
* 若MySQL评估使用索引比全表扫描更慢,则不使用索引
8.SQL提示
* 在SQL语句中加入一些人为提示来达到优化操作的目的
9.覆盖索引
* 查询使用了索引,并且需要返回的列在该索引中能够全部找到(尽量减少select *;而是在select后将需要查询的数据和索引中的数据对应起来)
10.前缀索引
* 只将字符串的一部分前缀抽取出来建立索引
* 一般用于字符串较长的场景,节约索引空间
* 创建前缀索引
CREATE INDEX idx_xxx ON TABLE_NAME(COLUMN(n))
11.单列索引和联合索引
* 单列索引:一个索引只包含单个列
* 联合索引:一个索引包含多个列
* 推荐使用联合索引,很多时候能够覆盖索引,能够减少回表查询
12.索引的设计原则
* 针对数据量较大,查询比较频繁的表建立索引(一百万数据以上)
* 针对常作为查询条件where、排序order by操作的人字段建立索引
* 尽量选择区分度高的列作为索引,尽量建立唯一索引
* 字符串类型字段可以选择前缀索引
* 尽量使用联合索引,很多时候可以覆盖索引,避免回表操作
* 控制索引数量,不能过多
* 索引列不能存储Null值一定要使用not null进行约束