Mysql专题篇章

一、事务的四大特性?

1、原子性: 是指事务包含的所有操作要么全部成功,要么全部失败回滚。
2、一致性: 是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有100块,两人之间转账之后无论成功还是失败,它们的账户总和还是100。
3、隔离性: 跟隔离级别相关,如orcel 默认read committed,一个事务只能读到已经提交的修改;mysql默认REPEATABLE READ,事务在执行过程中可以多次读取相同的数据,并且在事务结束之前,这些数据不会被其他事务修改。
**4、持久性:**是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

二、事务隔离级

脏读: 是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读: 是指在对于数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另一个事务修改了数据并提交了。
幻读: 是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,就像产生幻觉一样,这就是发生了幻读。
**不可重复读和脏读:**区别是脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

幻读和不可重复读: 都是读取了另一条已经提交的事务,不同的是不可重复读的重点是修改,幻读的重点在于新增或者删除。

事务隔离就是为了解决上面提到的脏读、不可重复读、幻读这几个问题。

MySQL数据库为我们提供的四种隔离级别:

Serializable (串行化):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

Repeatable read (可重复读):MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。

Read committed (读已提交):一个事务只能看见已经提交事务所做的改变。可避免脏读的发生。

Read uncommitted (读未提交):所有事务都可以看到其他未提交事务的执行结果。

三、索引

  1. 索引是存储引擎用于提高数据库表的访问速度的一种数据结构

  2. 优点:加快数据查找的速度,加快表与表之间的连接,排序或者是分组的字段添加索引可以加快分组和排序的速度

  3. 缺点:索引需要占用物理空间、会降低表的增删改的效率,因为每次对表记录进行增删改,需要进行动态维护索引,导致增删改时间变长

|------------------------------------------------------------------------|--------------------------------------------------------------------------|
| ##### 什么情况下需要建索引 | ##### 什么情况下不建索引 |
| 经常用于查询的字段。 经常用于连接的字段建立索引,可以加快连接的速度。 经常需要排序的字段建立索引,因为索引已经排好序,可以加快排序查询速度 | where条件中用不到的字段不适合建立索引 表记录较少 需要经常增删改 参与列计算的列不适合建索引 区分度不高的字段不适合建立索引,如性别等 |

索引的数据结构

索引类型有B+树索引和哈希索引,InnoDB引擎的默认的索引类型为B+树索引。

|---------------------------------------------------------------------------------------------------------|------------------------------|
| HASH索引 | B+树索引 |
| 哈希索引不支持排序,因为哈希表是无序的。 哈希索引不支持范围查找。 哈希索引不支持模糊查询及多列索引的最左前缀匹配。 因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的 | 支持 性能是相对稳定的,每次查询都是从根节点到叶子节点。 |

B+树特性
复制代码
B+树是B树的变种,有着比B树更高的查询效率。
1、B+树的特性
(1)有 k 个子树的中间节点包含有 k 个元素(B 树中是 k-1 个元素),每个元素不保存数据,只用来索引,所有数据
都保存在叶子节点。
(2)所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小
自小而大顺序链接。
(3)所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

2、总结
由于B+树的数据都存储在叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,而在数据库中基于范围的查询是非常频繁的,所以通常B+树用于数据库索引。

B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索引中可以存放更多的节点。高度低减少更多的I/O支出。

B+树的查询效率更加稳定,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
B+树与B树区别
复制代码
B+树的使用场景
B+树是在B树的基础上进行改造的,他的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。
B+树多用于数据库中的索引。

那么为什么B+树用于数据库中的索引呢?
原因:
因为在数据库中select常常不只是查询一条记录,常常要查询多条记录。比如:按照id的排序的后10条。如果是多条的话,B树需要
做中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表
就能够把所有数据取出来了
索引分类

主键索引:名为primary的唯一非空索引,不允许有空值

InnoDB聚集索引(聚簇索引)一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一个不允许为NULL的唯一索引。如果没有主键也没有合适的唯一索引,那么InnoDB内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键长度为6个字节,它的值会随着数据的插入自增。

唯一索引 :索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:唯一约束的列可以为null且可以存在多个null值。

组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时需遵循最左前缀原则。

全文索引 :只有在MyISAM引擎上才能使用,只能在CHARVARCHARTEXT类型字段上使用全文索引。

覆盖索引

select的字段列只用从索引中就能够取得,不需要回表进行二次查询,也就是说查询列要被所使用的索引覆盖。对于innodb表的二级索引,如果索引能覆盖到查询的列,那么就可以避免对主键索引的二次查询。

不是所有类型的索引都可以成为覆盖索引。覆盖索引要存储索引列的值,而哈希索引、全文索引不存储索引列的值,所以MySQL使用b+树索引做覆盖索引。

索引的设计原则、索引失效

设计原则

索引列的区分度越高,索引的效果越好

尽量使用短索引,涉及到的磁盘I/O较少,查询速度更快。(长的字符列上创建索引-前缀索引

// 列创建前缀索引
ALTER TABLE table_name ADD KEY(column_name(prefix_length));

索引不是越多越好,每个索引都需额外的物理空间,维护需要花费时间

最左前缀原则

导致索引失效的情况:

组合索引不是使用组合索引最左边的字段

以%开头的like查询如%abc,无法使用索引;非%开头的like查询如abc%,相当于范围查询,会使用索引

查询条件中列类型是字符串,没有使用引号,可能会因为类型不同发生隐式转换,使索引失效

判断索引列是否不等于某个值时

对索引列进行运算

查询条件使用or连接,也会导致索引失效

相关推荐
hxung6 分钟前
MySQL与Oracle深度对比
数据库·mysql·oracle
gys98957 分钟前
去除Mysql表中的空格、回车、换行符和特殊字符
数据库·mysql
SHIPKING39310 分钟前
【LangChain少样本提示工程实战】FewShotPromptTemplate原理与应用解析——附运行代码
数据库·python·langchain·llm·fewshotprompt
今天不学习明天变拉吉35 分钟前
分页查询列表每页1000条的优化
java·数据库·mysql·性能优化
huangsu_1231 小时前
java+postgresql+swagger-单表批量和循环insert、delete操作(八)
java·开发语言·数据库·postgresql
superonion06201 小时前
【DB2】备份失败SQL1762N
数据库
小小不董1 小时前
Oracle OCP认证考试考点详解083系列03
运维·服务器·数据库·oracle·dba
Hi_Lyn1 小时前
MySQL表的增删改查进阶版
数据库·笔记·mysql·学习方法
恬淡虚无真气从之2 小时前
mongodb 4.0+多文档事务的实现原理
数据库·mongodb
笑远4 小时前
不同服务器架构(x86、ARM、Power、SPARC)对数据库使用的影响
运维·服务器·数据库·架构