Mysql数据库知识总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。

一、为什么用自增列作为主键



1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。


如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。


如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。


2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放


因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)


3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页


4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置


此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销


同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。


二、为什么使用数据索引能提高效率



==数据索引的存储是有序的==

在有序的情况下,通过索引查询一个数据是无需遍历索引记录的

极端情况下,数据索引的查询效率为二分法查询效率,趋近于 log2(N)


三、B+树索引和哈希索引的区别



B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,==是有序的==,如下图:


哈希索引就是==采用一定的哈希算法,把键值换算成新的哈希值==,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可,==是无序==的,如下图所示:


四、哈希索引的优势



等值查询,哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题。)


五、哈希索引不适用的场景



不支持范围查询

不支持索引完成排序

不支持联合索引的最左前缀匹配规则

通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势:


在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引,例如这种SQL:


# 仅等值查询


select id, name from table where name='李明';


而常用的 InnoDB 引擎中默认使用的是B+树索引,它会实时监控表上索引的使用情况。


如果认为建立哈希索引可以提高查询效率,则自动在内存中的“自适应哈希索引缓冲区”建立哈希索引(在InnoDB中默认开启自适应哈希索引)。


通过观察搜索模式,MySQL会利用index key的前缀建立哈希索引,如果一个表几乎大部分都在缓冲池中,那么建立一个哈希索引能够加快等值查询。


注意:在某些工作负载下,通过哈希索引查找带来的性能提升远大于额外的监控索引搜索情况和保持这个哈希表结构所带来的开销。


但某些时候,在负载高的情况下,自适应哈希索引中添加的read/write锁也会带来竞争,比如高并发的join操作。like操作和%的通配符操作也不适用于自适应哈希索引,可能要关闭自适应哈希索引。


六、B树和B+树的区别



1、B树,==每个节点都存储key和data,==所有节点组成这棵树,并且叶子节点指针为nul,叶子结点不包含任何关键字信息。


2、B+树,所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小==自小而大的顺序链接==


所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)


七、为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?



1、B+的磁盘读写代价更低。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库
【6月更文挑战第14天】MySQL数据库
55 2
|
SQL 存储 关系型数据库
MYSQL数据库2
MYSQL数据库2
142 0
|
关系型数据库 MySQL 数据库
|
6月前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
SQL 关系型数据库 MySQL
MYSQL数据库3
MYSQL数据库3
54 0
|
关系型数据库 MySQL 数据库
mysql数据库介绍
mysql数据介绍
50 1
|
存储 关系型数据库 MySQL
|
SQL 存储 监控
简单说一下使用SQL数据库的心得
简单说一下使用SQL数据库的心得
106 1
|
SQL 关系型数据库 MySQL
存储模块之mysql数据库
存储模块之mysql数据库
81 0
|
SQL 存储 Oracle