mysql 索引

时间:2021-08-12
本文章向大家介绍mysql 索引,主要包括mysql 索引使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 索引:排好序的快速查找数据结构

优势:

会影响查询(select)(降低数据库io成本)

排序(order by)(降低cpu的消耗)

劣势:

索引也是一张表,保留了主键和索引字段,并指向实体表的记录,索引也是要占用空间的

降低更新表的速度(增删改),因为在更新表时,mysql不仅要保存数据,也要保存索引文件更新索引列的字段,调整因为更新所带来的索引信息

需要花时间研究建立最完美的索引(需要研究主要需要什么来索引)

 什么情况建索引:

主键自动建立唯一索引

频繁作为查询条件的应建索引

查询中与其他表关联的字段,外键关系建立索引

单键/组合索引的选择问题(高并发倾向建组合索引

查询中需要排序的字段需要建索引

查询中统计或分组(group by)字段

什么时候不要建索引:

表的记录太少(300百万级别)

经常增删改的表(不仅要保存表,还要保存索引文件)

 数据重复且平均分布的字段 (性别只有男女之分,且在表的分布将近为一半)

单值索引(一个索引只能包含一个列)(一个表可以有多个)

select * from user where name = ""

在user表中的name上建索引(索引名为(一般使用idx作为索引前缀):idx_user_name      建索引方法:create index)

create index idx_user_name on user(name)

复合索引

select * from user where name = "" and email = ""

在user表中的name和email上建索引(索引名为(一般使用idx作为索引前缀):idx_user_nameEmail      建索引方法:create index)

create index idx_user_nameEmail on user(name,email)

唯一索引(索引列的值必须唯一,允许有空值)(银行卡号)

create unique index

删除索引(idx_user_name是索引名   user是表名)

drop index idx_user_name on user

查看索引

show index from user

为什么选用B+树作为数据库的索引结构:
B+树的中间节点不保存数据,是纯索引,但是B树的中间节点是保存数据和索引的,相对来说,B+树磁盘页能容纳更多节点元素,更“矮胖”;
B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
对于范围查找来说,B+树只需遍历叶子节点链表即可,B树却需要重复地中序遍历,在项目中范围查找又很是常见的
增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。

b树(多路搜索树索引)(红色是数据  黄色是指针)

一个M阶的b树具有如下几个特征: (如下图M=3)(下文的关键字可以理解为 有效数据,而不是单纯的索引)

定义任意非叶子结点最多只有M个儿子,且M>2;
根结点的儿子数为[2, M];
除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整; (儿子数:[2,3])
非叶子结点的关键字个数=儿子数-1;(关键字=2)
所有叶子结点位于同一层;
k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。(k=2)

有关b树的一些特性,注意与后面的b+树区分:

关键字集合分布在整颗树中;
任何一个关键字出现且只出现在一个结点中;
搜索有可能在非叶子结点结束;
其搜索性能等价于在关键字全集内做一次二分查找;

b+树,是b树的一种变体,查询性能更好。m阶的b+树的特征:

有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。



原文地址:https://www.cnblogs.com/easyjava/p/15133495.html