索引
什么是索引:
帮助Mysql高效获取数据的数据结构,排好序的快速查找数据,类似与新华字典的目录;
为什么要建立索引:
1、提高查询效率:
没有排序之前一个一个的找,排序后,直接定义到想要的位置
2、排好序的快速查找数据结构————>索引
优势与劣势:
优势 | 劣势 |
---|---|
提高数据检索速度,降低数据库的IO成本 | 索引本身很大,往往以文件的形式存储在磁盘上 |
通过索引对数据进行排序,降低数据排序成本,降低了CPU的消耗 | 索引也是一张表,表中保存了主键与索引字段,并指向实体表的记录,所以也占了磁盘空间的 |
虽然提高了查询速度,但是也降低了更新表的速度(因为更新表的时候,不仅保存了数据,还要更新索引文件每次更新添加了索引列的字段,会调整因为更新所带来的键值变化后的索引信息) |
索引分类:
索引类型 | 说明 |
---|---|
单值索引 | 一个索引只包含间个列,一个表可以有多个单值索引(最好不超过5个) |
唯一索引 | 索引列的值必须是唯一的,允许有空置 |
复合索引 | 一个索引包含多个列 |
全文索引 | Mysql全文检索是利用查询关键字和查询内容之间的相关度进行检索,可以利用全文检索来提高匹配速度 |
索引为什么能快速查找数据:
概念 |
---|
在我们存数据时,如果建立索引,数据库系统会维护一个满足特定查找算法的数据结构,这些数据结构以某种方式引用数据 |
可以在这些数据结构之上,实现高级查找算法,这种结构就是索引 |
索引很大,不可能全部存储在内存中,所以,以文件的形式存储在磁盘上 |
为了加快数据的插找,可以维护二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录的物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取相应的数据,从而快速的检索出符合条件的记录 |
除了二叉树还有BTree索引 ,平常说索引,若没有指定,都指B树结构的索引 |
聚焦索引,次要索引,复合索引,前缀索引,唯一索引默认的都是B+树索引 |
除B树索引之外,还有哈希索引(Hash index) |
1.二叉查找树:
(1)特性:左子树的键值小于根的键值,右子树的键值大于根的键值
(2)示例图:
2.B-Tree(平衡多路查找树)
(1)特性:
m阶B-Tree满足以下条件 |
---|
0.根节点至少包括两个孩子 |
1.树中每个节点最多有m个孩子(m>=2) |
2.除了根节点和叶子节点外,其他每个节点至少有Celi(m/2)个孩子 |
3.所有叶子节点都在同一层 |
4.ki(1=1…n)为关键字,且关键字按顺序升序排列k(i-1)<k |
5.关键字的个数n满足:Celi(m/2)-1<=n<=m-1(非叶子节点关键字个数比指向) |
6.非叶子节点的指针p[1],p[2]…p[m],其中p[1]指向关键字小于k[1]的子树 p[m]指针的关键字大于k[m-1]的子树 p[i]指向关键字属于(k[i-1],k[i])的子树 |
(2)示例图:
3.B+Tree为主流索引数据结构(B+Tree是B-Tree的变体,基本与B-Tree相同)
不同点:
与B-Tree的差异点 |
---|
非叶子节点的子树指针与关键字个数相同 |
非叶子节点的子树指针,指向关键字值(k[i],k[i+1])的子树 |
非叶子节点仅用来做索引,数据都保存在叶子节点中 |
所有的叶子节点都有一个链指针指向下一个叶子节点 |
示例图:
主流索引数据结构的原因 | 解释 |
---|---|
更适合用来做存储索引 | |
磁盘读写代价更低 | 1.内部结构并没有指向关键字的具体指针;2.不存放数据,只存放索引信息;3. 内部节点相对于B树更小; |
查询效率更加稳定 | 1.内部节点并不是最终指向文件内容的节点,只是叶子节点中关键字的索引,所以他任何关键字的查找,必须走一条从根节点到叶子节点的路;2.所有关键字查询的长度相同,导致每一个数据查询的效率也几乎是相同的; |
更有利于对数据库的扫描 | 1. B树在提高IO性能的同时,并没有解决遍历数据效率低下的问题;2.B+树只需要遍历叶子节点,就可以解决对全部关键字信息的扫描;3.对数据库中,频繁使用的范围查询,性能更高; |
基本语法
创建索引:CREATE INDEX 索引名 ON 表名(要做索引的字段);
查看索引:SHOW INDEX FROM 表名;
删除索引:DROP INDEX 索引名臣 ON 表名;
更改索引:ALTER 表名 旧索引名 add primary key(字段名);
索引建立选择
适合建立索引:
1、主键自动建立唯一索引(primary);
2、频繁作为查询条件的字段(如银行系统的银行账号,电信公司的手机号);
3、查询中与其他表关联的字段,外键关系建立索引(如员工、部门外键);
4、频繁更新的字段不适合建立索引(不仅更新数据,还要更新索引);
5、where条件里用不到的字段不适合建立索引;
6、查询中排序的字段,若通过索引去访问将提升排序速度;
7、查询中统计或分组的字段(分组的前提是必排序);
不适合建立索引:
1、记录比较少;
2、经常增删改的表;
3、数据重复的表字段;