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连接,也会导致索引失效

相关推荐
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪3 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)5 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349845 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE5 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102166 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎6 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP6 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t6 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密6 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全