Mysql

https://www.518cn.com   发布时间:2025-03-18 22:24   作者:网络
摘要:MySql 1. 事务的四大特性? 事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 1.原子性是指事务包含的所有操作要么全部成功,要么全部失

MySql

1. 事务的四大特性?

事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

1.原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。

2.一致性是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,

​ 它们的账户总和还是1000。

3.隔离性。跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。

4.持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提 交事务的操作。

2. 事务隔离级别有哪些?

先了解下几个概念:脏读、不可重复读、幻读。

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

不可重复读是指在对于数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另一个事务修改了数据并提交了。

幻读是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,就像产生幻觉一样,这就是发生了幻读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

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

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

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

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

Repeatable read (可重复读):MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读

​ 取数据时,会看到同样的数据行,解决了不可重复读的问题。

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

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

查看隔离级别:

select @@transaction_isolation;

设置隔离级别:

set session transaction isolation level read uncommitted;

3. 索引

3.1. 什么是索引?

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

3.2. 索引的优缺点?

优点:

加快数据查找的速度

为用来排序或者是分组的字段添加索引,可以加快分组和排序的速度

加速表与表之间的连接

缺点:

建立索引需要占用物理空间

会降低表的增删改的效率,因为每次对表记录进行增删改,需要进行动态维护索引,导致增删改时

间变长

3.3. 索引的作用?

数据是存储在磁盘上的,查询数据时,如果没有索引,会加载所有的数据到内存,依次进行检索,读取

磁盘次数较多。有了索引,就不需要加载所有数据,因为B 树的高度一般在2-4层,最多只需要读取2-4

次磁盘,查询速度大大提升。

select @@transaction_isolation;

set session transaction isolation level read uncommitted;

3.4. 什么情况下需要建索引?

  1. 经常用于查询的字段

  2. 经常用于连接的字段(如外键)建立索引,可以加快连接的速度

  3. 经常需要排序的字段建立索引,因为索引已经排好序,可以加快排序查询速度

3.5. 什么情况下不建索引?

  1. where条件中用不到的字段不适合建立索引

  2. 表记录较少

  3. 需要经常增删改

  4. 参与列计算的列不适合建索引

  5. 区分度不高的字段不适合建立索引,性别等

3.6. 索引的数据结构

索引的数据结构主要有B 树和哈希表,对应的索引分别为B 树索引和哈希索引。InnoDB引擎的索引类

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

B ****树索引

B 树是基于B 树和叶子节点顺序访问指针进行实现,它具有B树的平衡性,并且通过顺序访问指针来提

高区间查询的性能。

在 B 树中,节点中的 key 从左到右递增排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi 1,则

该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi 1。

进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地在指针所指向的节点进

行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的数据项。

3.7. Hash索引和B 树索引的区别?

哈希索引不支持排序,因为哈希表是无序的。

哈希索引不支持范围查找。

哈希索引不支持模糊查询及多列索引的最左前缀匹配。

因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,而B 树索引的性能是相对稳定

的,每次查询都是从根节点到叶子节点。

3.8. 为什么B 树比B树更适合实现数据库索引?

由于B 树的数据都存储在叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即

可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按

序来扫,所以B 树更加适合在区间查询的情况,而在数据库中基于范围的查询是非常频繁的,所以

通常B 树用于数据库索引。

B 树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索

引中可以存放更多的节点。减少更多的I/O支出。

B 树的查询效率更加稳定,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查

询的路径长度相同,导致每一个数据的查询效率相当。

3.9. 索引有什么分类?

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

  2. 唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:

UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中

的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下:

  1. 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段

时,索引才会被使用,使用组合索引时遵循最左前缀原则。

  1. 全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索

引。

3.10. 什么是最左匹配原则?

如果 SQL 语句中用到了组合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个组合索引去进

行匹配。当遇到范围查询(>、<、between、like)就会停止匹配,后面的字段不会用到索引。

对(a,b,c)建立索引,查询条件使用 a/ab/abc 会走索引,使用 bc 不会走索引。

对(a,b,c,d)建立索引,查询条件为 a = 1 and b = 2 and c > 3 and d = 4 ,那么,a,b,c三个字段能

用到索引,而d就匹配不到。因为遇到了范围查询!

Index_comment:

Visible: YES

Expression: NULL

ALTER TABLE table_name

ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);如下图,对(a, b) 建立索引,a 在索引树中是全局有序的,而 b 是全局无序,局部有序(当a相等时,会

对b进行比较排序)。直接执行 b = 2 这种查询条件没有办法利用索引。

从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b

的值为1,4也是有序状态。 因此,你执行 a = 1 and b = 2 是a,b字段能用到索引的。而你执行 a > 1

and b = 2 时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这

个范围内b值不是有序的,因此b字段用不上索引。

3.11. 什么是聚集索引?

InnoDB使用表的主键构造主键索引树,同时叶子节点中存放的即为整张表的记录数据。聚集索引叶子节

点的存储是逻辑上连续的,使用双向链表连接,叶子节点按照主键的顺序排序,因此对于主键的排序查

找和范围查找速度比较快。

聚集索引的叶子节点就是整张表的行记录。InnoDB 主键使用的是聚簇索引。聚集索引要比非聚集索引

查询效率高很多。

对于InnoDB来说,聚集索引一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一

个不允许为NULL的唯一索引。如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏

的主键作为聚集索引,这个隐藏的主键长度为6个字节,它的值会随着数据的插入自增。

3.12. 什么是覆盖索引?

select的数据列只用从索引中就能够取得,不需要回表进行二次查询,换句话说查询列要被所使用的索

引覆盖。对于innodb表的二级索引,如果索引能覆盖到查询的列,那么就可以避免对主键索引的二次查

询。

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

索引列的值,所以MySQL只能使用b 树索引做覆盖索引。

对于使用了覆盖索引的查询,在查询前面使用explain,输出的extra列会显示为 using index 。

比如 user_like 用户点赞表,组合索引为(user_id, blog_id),user_id和blog_id都不为null。

Extra中为 Using index ,查询的列被索引覆盖,并且where筛选条件符合最左前缀原则,通过索引查

就能直接找到符合条件的数据,不需要回表查询数据。

Extra中为 Using where; Using index , 查询的列被索引覆盖,where筛选条件不符合最左前缀原

则,无法通过索引查找找到符合条件的数据,但可以通过索引扫描找到符合条件的数据,也不需要回表

查询数据。

3.13. 索引的设计原则?

索引列的区分度越高,索引的效果越好。比如使用性别这种区分度很低的列作为索引,效果就会很

差。

尽量使用短索引,对于较长的字符串进行索引时应该指定一个较短的前缀长度,因为较小的索引涉

及到的磁盘I/O较少,并且索引高速缓存中的块可以容纳更多的键值,会使得查询速度更快。

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

利用最左前缀原则。

3.14. 索引什么时候会失效?

导致索引失效的情况:

对于组合索引,不是使用组合索引最左边的字段,则不会使用索引

以%开头的like查询如

相关文章

最新评论