索引是一种加快检索的数据库结构,他包含从表或者视图的一列或多列生成的键,以及映射到指定数据库存储位置的指针。
索引是直接加在字段上的,创建索引是需要消耗时间的 ,索引也需要占用物理空间
常见索引类型:
普通索引
唯一索引:【UNIQUE】 主键自带索引
聚集索引:【CLUSTERED】
非聚集索引:【NONCLUSTERED】
全文索引: 主要用于varchar char text等类型上
单列索引: 只能作用一个字段
多列索引 : 多个字段连起来创建索引 空间索引
创建索引
语法:
create 索引类型 index 索引名 on 表名(需要添加索引的列)
例1) 为表SC在SNO,CNO上建立唯一索引。
create unique index T on SC(SNO,CNO)
例2)为教师表T在TN 上建立聚集索引
create clustered index Y on TN (TN)
例3)为教师表T在TN 上建立非聚集索引
create nonclustered index Y on TN (TN)
删除索引
语法: DROP index 表名.具体要删除的索引名
例1)删除T表中索引名为T1的索引
drop index T.T1
有索引会形成一个二叉树
索引的优缺点
索引结构
如果没有指定 默认都是B+Tree索引
如果以二叉树为数据结果那么如果数据是有序的 那么检索的时候就是会层级比较深性能大大降低,为了规避这种情况我们使用红黑树。
但是红黑树在大数据情况下 层级较深 检索速度会变慢
B-Tree
每个节点最多存4个key 5个指针
当超过节点key时中间节点会向上分裂
B-Tree的数据保存过程
例如此时再插入一个1200的值节点
插入1200后 345成为中间节点则向上分裂
当再插入一个值为1234的节点时因为1234大于345 放右边
可视化数据结构显示:
https://www.cs.usfca.edu/~galles/visualization/BTree.html
B+树
所有的元素都会出现在叶子节点,并且叶子节点会形成一个单向链表,非叶子节点作为索引的作用,叶子节点作为存储数据的作用
Mysql中的B+Tree
Hash索引
HASH索引会把这一行数据计算其HASH值,然后例如我们需要把下列的name 创建Hash索引,则根据name的值计算HASH槽位 来获取里面的值
索引分类
在InnoDB存储引擎下又可以细分为聚集索引和二级索引
聚集索引和二级索引的区别
例子:
回表查询
先根据二级索引找到对应的聚集索引id 然后根据聚集索引id找到该行数据(查原表)
SQL性能分析
1.SQL执行频率查询
语句 show global status like 'com_______' # 7个下划线
慢查询日志
profile
profile能够在我们进行sql优化的时候查看耗时情况
select @@have_profiling # 检查是否支持
SET profiling =1 # 开启profile 默认是关闭的
show profiles; # 查看每一条sql的耗时基本情况
show profile for query query_id; # 查看指定query_id的sql语句的各个阶段的情况
show profile cpu query query_id; # 查看指定query_id的sql语句的cpu使用的情况
例子: