版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:[https://blog.csdn.net/u014427391/article/details/100846922](https://blog.csdn.net/u014427391/article/details/100846922)
继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本博客是我在学习尚硅谷的学习教程后,做的笔记,当然我不是为了所谓宣传,仅仅是学习记录的笔记。本来可以不分享出来,不过,分享出来的笔记不仅可以给网上的学习者参考学习,同时写在csdn比较方便,可以支持图片上传,也方便自己以后查找复习
- [一、索引的概念](http://yehe.isd.com/column/support-plan/article-edit/6157567#_4)
- [二、索引分类](http://yehe.isd.com/column/support-plan/article-edit/6157567#_8)
- [三、索引用法](http://yehe.isd.com/column/support-plan/article-edit/6157567#_14)
- [四 、索引架构简介](http://yehe.isd.com/column/support-plan/article-edit/6157567#__65)
- [五、索引适用的情况](http://yehe.isd.com/column/support-plan/article-edit/6157567#_83)
- [六、索引不适用的情况](http://yehe.isd.com/column/support-plan/article-edit/6157567#_92)
MySQL官方给出的索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。所以说索引就是排好序的快速查找数据结构
MySQL的索引可以分为几种:
create [unique] index indexName on tableName(columnName(length));
比如给dept表创建索引idx_dept_id
create idx_dept_id on dept(id);
语法:
alter tablename add [unique] index indexname on columnName(length);
drop index indexname on tablename;
show index from tablename ;
如果要显示换行可以加上\G,不过就不能加上分号
show index from tablename \G
# 添加一个主键,主键是唯一的,不能为Null
alter table tablename add PRIMARY KEY(columnName);
#创建唯一索引,要求索引唯一,不过允允许空值
alter table tablename add unique index indexname on(columnName);
# 创建普通的索引,索引数据可以不唯一
alter table tablename add index indexname on(columnName);
# 指定索引为FullText,用于全文索引
alter table tablename add FULLTEXT indexname on(columnName);
MySQL的索引结构可以分为:
引用尚硅谷MySQL教程的图,本博客只介绍BTree索引的
从图可以看出BTree索引的结构其实就是一棵B+树,并不一定是二叉树,也有可能是一棵多叉树,MySQL也是分为段区块这种结构的,如图,浅蓝色部分就是一个磁盘块,蓝色部分表示数据项,而黄色部分表示指针
假如我要查找29这个值,就是遍历下来,分别查找磁盘块1、磁盘块3、磁盘块8,根据指针查找下来,速度非常块,假如有几百万数据的话,能走索引的情况,是非常快的,性能对比可想而知
注意:只有叶子节点(最下面的节点)是存储要查找的数据的,非叶子节点存储的数据只是用于指针索引的数据项而已
注意:需要经常修改的列不适合建立索引,因为更新数据的同时也会重新构建索引,比较耗性能;在高并发的情况,更倾向于建立组合索引,因为一般来说,查询很少有一个条件,一般是多个条件,复合索引比较适合
注意:索引应该加在经常查询或者排序的列,数据重复而且分布很平均的情况,是不适合加索引的 引用尚硅谷老师的归纳: