大家好,我是anyux。本文介绍MySQL数据库的索引创建与删除。
BTree树的索引分类
聚集索引,聚集索引一般是主键列辅助索引,辅助索引辅助聚集索引
聚集索引生成过程
MySQL会自动选择主键作为聚集索引列,没有主键列会选择唯一键,如果都没有会生成隐藏的主键列
MySQL进行存储时,会按照聚集索引列值的顺序,有序存储数据行聚集索引直接将原表数据页,作为叶子结点,然后提取聚集索引列向上生成枝和根
辅助索引生成过程
管理员选择一个列创建辅助索引
MySQL会自动将此列的值取出来将此列的值自动排序将排好序的数据,均匀的存储到索引的叶子节点生成枝节点和根节点
辅助索引的使用过程
先遍历辅助索引,找到对应的索引键值所对应的id值或者是主键值,进而使用主键值回到聚集索引,再进行遍历查询找到指行数据
聚集索引和辅助索引的区别
表中的任何一个列都可以创建辅助索引,在你有需要的时候,只要名字不同即可在一张表中,聚集索引只能有一个,一般是主键辅助索引,叶子结点只存储索引列的有序值聚集索引,叶子结点存储的是有序的整行数据MySQL的表数据存储是聚集索引组织表
辅助索引细分
单列辅助索引
联合索引(覆盖索引)[重要]
唯一索引
索引树高度通常情况下,千万级别的数据,索引树高度应该在3~4层,
数据行数较多时候
分表:MySQL自带的partion功能,使用的比较少了
分片:分布式架构(分库)
字段长度
业务允许,尽量选择长度短的列作为索引列
业务不允许,选择前缀索引
数据类型
对于变长长度的列来讲,使用varchar类型比char类型要有优势。对于大表而言,使用char数据类型的每个索引长度都是固定值,空格也算在索引的长度里面,而varchar不是。所以叶子结点的消耗较大,因而要选择varchar数据类型
索引的命令操作
索引查询
PRI 主键索引
MUL 辅助索引
UNI 唯一索引
use world;
查看索引
desc city;
查看索引详细信息
show index from city;
创建索引
注意,创建索引也是在线的DDL操作,操作时也会出现锁表现象。所以创建索引操作应该是业务低谷时间进行操作或者使用PTOSC这样的工具操作,减少对业务的影响
创建单列的辅助索引
use world;
为city表的name列创建索引
alter table city add index idx_name(name);
查看索引详情
show index from city;
创建联合多列的辅助索引
use world;alter table city add index idx_c_p(countrycode,population);
创建唯一索引
注意,首先需要判断创建索引的列是否存在重复值,存在重复值的列,无法创建唯一索引
use world;select count(district) from city;select count(distinct district) from city;
事实说明存在重复值,district列不应当做唯一索引
alter table city add unique index uidx_dis(district);
创建前缀索引
前缀索引和普通索引没差,只是不能使用数字作为索引列
use world;alter table city add index idx_dis(district(5));
删除索引
use world;show index from city;
mysql 批量删除索引
alter table city drop index idx_name;alter table city drop index idx_c_p;alter table city drop index idx_dis;