MySQL索引(index)
索引的概述,作用及其优缺点
索引是一种有序的数据结构,用来高效获取数据的
假设查一张表中age为18的所有数据
无索引的情况,找到了age为18后还要继续扫描全表,看是否还有age是18的,这就是全表扫描,性能极差
有索引的情况,给age做一个二叉树,能快速找到
优缺点
每次更新表,同时也要更新索引
索引结构
一般说到的索引,没有明确指出,都是B+树结构的索引
二叉树、红黑树的缺点
B树
当一个节点存满5个数据时,中间数据向上裂变,剩余4个左右两两裂开。
数据结构动态演示网站
B+树
只有叶子节点存放数据,叶子节点形成了一个单项链表
4阶:每个节点有最多有3个数据,最多指向4个节点
当一个节点存满4个数据时,中间数据向上复制裂变,数据左右裂开(向上裂变的数据也在),中间形成链表。
MySQL在B+树基础上叶子节点间形成了双向链表
hash索引的数据结构
先hash计算每一行的hash值,确定要设置为索引的字段,该字段经过hash计算后,落到数组中对应的槽位,每个数组记录字段值和行hash值
索引的分类
根据索引的存储形式
聚集索引的叶子节点下挂的是这一行的数据。
二级索引的叶子节点下挂的是对应的主键。
回表索引:先走二级索引拿到对应的主键值,再走聚集索引,拿到对应的行数据
索引语法
创建索引
中括号:唯一索引,全文索引,不写就是常规索引
小括号里的是:表中的字段名,要为表中的哪个字段创建索引,一个索引可以关联多个字段的。关联一个索引叫单列索引,关联多个字段叫:联合索引/组合索引。注意写关联索引的小括号内,写顺序是有讲究的。
SQL性能分析
为了做SQL优化。主要优化查询语句。
SQL执行频率
确定当前数据库是以查询为主还是以增删改为主,增删改为主就没有必要SQL优化
模糊查询:7个下划线
慢查询日志
知道了要针对查询语句优化,但是具体要针对哪些select语句优化呢?就需要借助数据库慢查询日志,定位哪些select语句查询效率低,并针对优化
profile
比慢查询更全面,查看每一条sql语句耗时
explain执行计划
只看sql执行时间不能真正判断执行效率,性能
重点关注type字段
索引使用原则
最左前缀法则(针对联合索引)
如果索引了多列(联合索引),要遵守最左前缀法则。
最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。
如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
要想使用联合索引,查询条件必须保证最左边的索引存在(不用一一对应),中间不能跳过某一列,如果跳过,后面索引失效。
范围查询(联合索引中的)
复合索引中出现范围查询(<,>大于小于),范围查询条件右侧的列索引失效
如何规避?尽量使用大于等于 / 小于等于范围查询条件
索引列运算
在索引列中进行运算操作,会导致索引失效。
字符串不加单引号
字符串类型字段使用时,不加引号,索引会失效。
模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。