MySQL索引
索引是帮助MySQL高效获取数据的一种数据结构。在数据库中,数据库系统维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法(B+树),这种数据结构就是索引(排好序的快速查找数据结构
)。
一般情况下,索引本身占用内存也比较大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
索引会影响where后面的语句和order by后的语句执行。
索引优点
- 提搞数据查询效率,降低数据库IO成本。类似图书馆图书建立索引
- 通过索引对数据进行排序,降低数据排序成本,降低CPU消耗。
索引缺点
- 索引本质上也是一张表,该表存储了主键与索引字段,并指向实体表的对应记录,所以索引也会占用磁盘空间。
- 虽然索引能够提高查询效率,但是索引会降低表的更新效率,比如对于insert、update、delete。因为更新表是,MySQL不仅要存储数据,而且还要保存一次索引文件,保存每次更新添加了索引的字段,会因为更新所带来的键值变化后的索引信息。
MySQL索引分类
类型
- 单值索引
一个索引值包含单个列,一个表可以包含多个单值索引 - 唯一索引
索引列的值必须是唯一的,可以为空 - 符合索引
索引包含多个列
基本语法
#新增
create index [index name] on [table name]( [column name] (len));
alter [table name] add index [index name] on ([column name]);
#删除
drop index [index name] on [table name];
#查看
show index from [table name];
#使用alter命令
alter table [table name] add primary key([columnname]);#新增主键索引,唯一且不能为空
alter table [table name] add unique [index name]([column name]);#新增唯一索引,唯一索引的值可以为空
alter table [table name] add [index name]([column name]);#新增普通索引,单列索引和复合索引
alter table [table name] add fulltext [index name]([column names]);#新增全文索引
索引结构
mysql索引结构包含:BTree索引、Hash索引、full-text全文索引、R-Tree索引;mysql唯一、主键、普通索引使用的索引结构:BTree
BTree 索引原理
初始化介绍建索引的场景
适合建立索引场景
- 主键自动创建唯一索引
- 频繁作为查询条件的字段应创建索引
- 查询中与其他表关联的字段(外键关系)应建立索引
- 频繁更新的字段不适合创建索引(每次更新不仅仅是更新数据本身而且会更新索引记录表)
- where 条件里用不到的字段不建立索引
- 单值/符合索引选择的问题,在高并发场景下通常建立复合索引
- 查询中排序的字段可建立索引(排序字段如果通过索引去访问将会提升排序速度)
- 查询中统计或者分组字段可建立索引
不适合建立索引的场景
- 表记录太少
- 经常进行增删改的表(增删改除了更新数据本身还会更新索引文件)
- 数据平均分布且重复的表字段不适合建索引,因此应该只为最经常查询和最经常排序的数据列建立索引;如果某个数据列包含许多重复内容,为它建立索引就没有太大的实际效果。(例如一个表有100万行记录,有一个字段只有0和1这两种值,且每个值的分布概率大约为50%
(性别)
,那么对这个字段建索引一般不会提高查询效率)。
索引的选择性
索引的选择性是只索引列中不同值的数据与表记录行总数的比值,如果表中有十万行记录,表的索引列有九万个不同的值,那么索引的选择性就是90000/100000=0.9;当索引选择性比值越接近于1,这个索引的效率就越高,反之则越低。
网友评论