1. mysql聚簇和非聚簇索引的区别是什么?

聚簇索引,将数据存储与索引放到了一块、并且是按照一定的顺序组织的(这种组织在innodb中是B+树),找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的。
非聚簇索引叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类似一本书的目录,比如我们要找第三章第一节,那我们先在这个目录里面找,找到对应的页码(聚簇索引)后再去对应的页码看文章。
区别一:
聚集索引:就是以主键创建的索引,在叶子节点存储的是表中的数据
非聚集索引:就是以非主键创建的索引(也叫做二级索引),在叶子节点存储的是主键和索引列。
区别二:
聚集索引中表记录的排列顺序和索引的排列顺序一致;所以查询效率快,因为只要找到第一个索引值记录,其余的连续性的记录在物理表中也会连续存放,一起就可以查询到。缺点:新增比较慢,因为为了保证表中记录的物理顺序和索引顺序一致,在记录插入的时候,会对数据页重新排序。
非聚集索引中表记录的排列顺序和索引的排列顺序不一致(因为它是二级索引)。
区别三:
聚集索引是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储不连续。
区别四:
聚集索引每张表只能有一个,非聚集索引可以有多个。

2. mysql索引结构有哪些,各自的优劣是什么?(Mysql索引默认数据结构)(B+树相对B树的优点)(mysql为什么用B+树而不是B树)(mysql的b+树一般多高,层高则么计算)

索引的数据结构和具体存储引擎的实现有关,mysql中使用较多的索引有hash索引,B+树索引,
innodb的索引实现为B+树,memory存储引擎为hash索引。
innodb选择用B+树作为索引结构是因为,第一,B+树存储的层数低,尽可能少的IO次数。3层的B+树就可以存储千万级数据,但需要额外的磁盘空间,而innodb索引存储在磁盘上,这样的存储空间是可以接受的。第二,查询能力稳定。B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的二节点间有指针相关连接,在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动。第三,有良好的范围查找能力。叶子节点是有序地用双向指针进行连接,所以在范围查找情况下,效率非常高。因为,B+树索引被广泛应用于数据库、文件系统等场景。
Memory引擎使用hash作为索引,是因为,第一,通过hash查找效率很高。第二,hash存储比B+树更节约内存。
Memory引擎也存在它的问题,第一,hash散列是无序的,在范围查找时候,需要查找整表,效率低下。
第二,随着数据增多,有很多数据在存储时会产生hash冲突,那么在查找时候,会有很多hash相同但是value不同的数据,这时候要进行整表查询,效率低下。
与二叉树对比
假设使用二叉树,首先,查找时候IO次数较多。当插入很多的数据时,它的二叉树高度较高,假设查找某个数据A,那么每次查找进入到下一层都是一次IO,那么它的IO次数比较多。其二,范围查找时,树的回旋操作较多,范围查找效率低。假设叶子节点数值为5,现在要查找大于5的所有节点,那么在查找的过程中,二叉树将会反复的回到父类节点,再去比对它的右节点,执行这样的回旋操作直到遍历完这棵树,这样的查询效率是很低的。
与b树对比
B树的特点是节点排序,同时一个节点存储多个元素,这多个元素也是排序的。B+树的特点是,拥有了B树的特点且叶子节点之间有双向指针,便于范围查找。所以B树也存在着回旋操作较多,范围查找效率低的问题,B+树通过双向链表彻底解决了这个问题。
B+树的层高计算
一个数据页16KB是由4个系统块组成,一个系统块由8个磁盘扇区组成,每个扇区512字节。

3. mysql锁的类型有哪些?

基于锁的属性分类:共享锁、排他锁。
基于锁的粒度分类:行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb引擎)、
记录锁、间隙锁、临键锁。
基于锁的状态分类:意向共享锁、意向排它锁。

4. 事务的基本特性是什么?

事务四大特征:原子性,一致性,隔离性和持久性。
1.原子性(Atomicity)
一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执
行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。
2.一致性(Consistency)
一致性代表了底层数据存储的完整性。它必须由事务系统和应用开发人员共同来保证。事务系统通
过保证事务的原子性,隔离性和持久性来满足这一要求;应用开发人员则需要保证数据库有适当的
约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预
期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与
另一账户中存入的金额相等。支付宝账号100你读到余额要取,有人向你转100但是事物没提交
(这时候你读到的余额应该是100,而不是200)这种就是一致性
3.隔离性(Isolation)
隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执
行完毕之前,其所访问的数据不能受系统其他部分的影响。
4.持久性(Durability)
持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种
物理存储设备。这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。

5. MySQL的隔离级别有哪些?

MySQL定义了四种隔离级别读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。四种隔离基本严格程度依次递增。
在mysql的读写问题存在脏写、脏读、不可重复读、幻读。对于脏写以上四种隔离级别都能解决,可重复读、读未提交、串行化、分别解决了脏读、不可重复读、幻读。
读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然
在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
脏读:读到其他事务未提交的数据;
不可重复读:前后读取的记录内容不一致;
幻读:前后读取的记录数量不一致。
image.png
图练习图
若隔离级别是“读未提交”, 则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
若隔离级别是“读提交”,则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
若隔离级别是“可重复读”,则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
若隔离级别是“串行化”,则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

6. 怎么处理MySQL的慢查询?

1、开启慢查询日志,准确定位到哪个sql语句出现了问题
2、分析sql语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写
3、分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引
4、如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。

7. ACID是靠什么保证的?

原子性由undolog日志来保证,它是一个逻辑日志,它记录了需要回滚的日志信息
隔离性是由MVCC来保证
持久性由redolog,redolog是一个物理地址日志。
当Mysql更新数据时,相当于启动了一个更新数据的事务,在数据库中执行更新后,首先将数据插入到buffer pool同时将更新前的数据记录在undolog日志上用于回滚。当执行roll back或者在写redolog时出错,mysql引起挂了,那么这时需要进行回滚。所以undolog保证了原子性,要么都执行,要么回退到之前。
如果已经修改的数据记录到了redo log并持久化,但数据本身没有写回磁盘,此时系统崩溃,存储引擎在重启时根据redo log自动恢复这部分修改的数据。

8. 简述mysql中索引类型有哪些,以及对数据库的性能的影响?

普通索引:允许被索引的数据列包含重复的值
唯一索引:可以保证数据记录的唯一性
主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录(在innodb中如果不设置主键也有一个默认的主键索引)
联合索引:索引可以覆盖多个数据列
全文索引:通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术
索引可以极大地提高数据的查询速度通过使用索引。在mysql执行的优化器部分,通过建立索引可以让优化器选择更快的查询方式。但是索引额外的占用了物理空间。聚簇索引是一级索引、非聚簇索引是二级索引且指向一级索引。所以,当一级索引有数据更改,二级索引也会跟着改变。如果非聚簇索引很多,那么消耗的系统资源是较大的。

9. mysql日志文件有哪些,分别介绍下

Mysql主要的日志有redo日志、binlog日志、undo日志。其他的日志还有慢查询日志、通用查询日志、错误日志、二进制日志、中继日志。
redo日志是物理日志,存储了数据库更新是具体操作的数据页内容,在出现Mysql宕机时,起到保证数据的完整性;
undo日志保证事务的原子性,记录数据更新前的副本达到可回退的功能;
binlog日志是一种逻辑日志,它记录数据库的逻辑操作。用于数据库恢复,比如定时存储数据库副本后,可以根据副本的时间执行之后的binlog中的日志内容达到回复数据库的作用。在主从复制中,实现主从同步,从机根据Binlog中的内容进行对主机数据的复制。
慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,
对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的
状态,从而对服务器进行维护。
二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故
障时数据的无损失恢复。
中继日志:用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。
从服务器通过读取中继日志的内容,来同步主服务器上的操作。
数据定义语句日志:记录数据定义语句执行的元数据操作。

10. 谈一谈mysql的各种引擎(mysql innodb和myisam区别)(简述Myisam和Innodb的区别?)

MyISAM与InnoDB大致有五点不同:
数据的存储结构不同
在文件结构中,InnoDB将存储数据和索引放在一个文件当中。而MyISAM将存储数据和索引拆分放在两个文件中。所以在InnoDB的B+树上叶子节点直接存储数据,而MyISAM存储的是数据的地址。
存储空间的消耗不同
MyISAM会有一张压缩表,数据存储在MyISAM上可能会被压缩,而InnoDB则它的存储空间只受限于操作系统的文件大小。
对事务的支持不同
InnoDB支持事务支,MyISAM不支持,它支持原子性。InnoDB可以根据事务日志进行回滚,奔溃恢复。
对锁的支持不同
InnoDB支持行级锁,MyISAM支持表级锁,在进行大量的更新操作时候,InnoDB的性能会更好一点,因为它的锁的粒度更细。
对外键的支持不同
MyISAM是不支持外键的,而InnoDB是支持外键的。
是否支持MVCC
MyISAM不支持,而InnoDB支持
是否支持数据库异常奔溃后的安全恢复
MyISAM 不支持,而 InnoDB 支持。
使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。

11. mysql里的主键,外键以及组合索引分别在什么场景下使用

12. 为什么实际项目里不建议使用外键

使用外键可以关联两个不同的表的数据,它有如下好处。第一,保证数据的完整性和一致性。第二,级联操作方便。第三,将完整性判断交给数据库,减少业务代码量。
但是由于外键的特性也伴随着一些弊端,第一,性能降低,假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。第二,高并发情况下容易造成死锁。在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。第三,扩展性差。Mysql外键不易移植到其他数据库。分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。第四,增加DBA的技术能力要求。

13. 【设计题】根据查询场景设计索引

14. Mysql联合查询时候应该注意哪些问题

第一,exist和in使用问题。in方式是把外表和内表做hash连接,先查询内表,返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作。exists方式是对外表做loop循环,循环后再对内表查询,将主查询的数据放入子查询中做条件验证,根据验证结果来决定主查询的数据是否得以保留。在外表大的时用in效率更快,内表大用exists更快。在执行速度上,in更快,所以尽量使用in的方式小表驱动大表。
第二,MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3)对于连续的数值,能用between就不要用in了;再或者使用连接来替换。

15. 从数据结构角度分析最左查询

16. 如果mysql表中有一个字段很大有几k会有什么问题吗?

列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多,索引的性能也就越差。

17. 索引下推了解吗?

索引下推是MySQL 5.6版本中提供的一项索引优化功能,可以在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。默认开启,可以通过配置进行关闭。
—2022-6-24-21时25分58秒—

18. (联合索引abc,where a=3 and b>3 and c=3则么走索引)

在二级索引上首先找出a=3的所有数据,此时所有下推生效,过滤出b>3 同时满足c=3的所有数据然后进行回表操作。

19. Mysql中的行锁以及表锁及其特性

从数据操作的类型划分:读锁、写锁:
读锁 :也称为 共享锁 、英文用 S 表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。
写锁 :也称为 排他锁 、英文用 X 表示。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。
从数据操作的粒度划分:表级锁、页级锁、行锁
表锁可以分为,表级别的S锁、X锁、意向锁 (intention lock)、自增锁(AUTO-INC锁)、元数据锁(MDL锁)
行锁可以分为,记录锁(Record Locks)、 间隙锁(Gap Locks)、临键锁(Next-Key Locks)、 插入意向锁(Insert Intention Locks)
页锁
页锁就是在 页的粒度 上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录。当我
们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。页锁的开销
介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,并发度一般。
锁升级
每个层级的锁数量是有限制的,因为锁会占用内存空间, 锁空间的大小是有限的 。当某个层级的锁数量
超过了这个层级的阈值时,就会进行 锁升级 。锁升级就是用更大粒度的锁替代多个更小粒度的锁,比如
InnoDB 中行锁升级为表锁,这样做的好处是占用的锁空间降低了,但同时数据的并发度也下降了。
从对待锁的态度划分:乐观锁、悲观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上
锁,这样别人想拿这个数据就会 阻塞 直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,
用完后再把资源转让给其它线程)。比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,当
其他线程想要访问数据时,都需要阻塞挂起。Java中 synchronized 和 ReentrantLock 等独占锁就是
悲观锁思想的实现。
乐观锁认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都对数据上锁,但是在更新
的时候会判断一下在此期间别人有没有去更新这个数据,也就是不采用数据库自身的锁机制,而是通过
程序来实现。在程序上,我们可以采用 版本号机制 或者 CAS机制 实现。乐观锁适用于多读的应用类型,
这样可以提高吞吐量。在Java中 java.util.concurrent.atomic 包下的原子变量类就是使用了乐观锁
begin;
select * from student where id <=8 and id > 3 for update;的一种实现方式:CAS实现的。
https://tech.youzan.com/seven-questions-about-the-lock-of-mysql/
https://zhuanlan.zhihu.com/p/71156910

20. Mysql优化方法(Mysql优化方法有哪些?)真的会这么问吗?

https://javaguide.cn/database/mysql/mysql-high-performance-optimization-specification-recommendations.html#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%91%BD%E4%BB%A4%E8%A7%84%E8%8C%83

21. 一条SQL语句执行得很慢的原因有哪些?

https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485185&idx=1&sn=66ef08b4ab6af5757792223a83fc0d45&chksm=cea248caf9d5c1dc72ec8a281ec16aa3ec3e8066dbb252e27362438a26c33fbe842b0e0adf47&token=79317275&lang=zh_CN%23rd

22. mysql执行过程

客户端首先通过连接器与mysql进行连接尝试,连接器负责管理链接,权限验证。接下来,去查询缓存中进行查询。在Mysql8.0之后的版本中查询缓存已经被移除,所以在Mysql8.0之后的版本将跳过此步骤。如果是Mysql8.0以前,查询缓存,缓存命中,那么直接返回。随后,进入分析器分析器会检查语法是否正确。SQL语句语法正确将进入优化器,在这个环境优化器有优化算法,选择更高效的查询方式。执行引擎从数据库引擎中返回数据,在执行SQL语句之前会判断是否有权限,假设没有权限那么将会报错。

23. MySQL 支持哪些存储引擎?默认使用哪个?

MySQL 5.5.5 之前,MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。

24. MySQL 存储引擎架构了解吗?

MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的,而不是数据库。并且可以根据自己的需求去编写一个自定义的存储引擎。

25. MyISAM 和 InnoDB 如何选择?

选择InnoDB,在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点。
因此在日常开发中选择innodb。

26. MySQL 查询缓存

开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。
查询缓存不命中的情况:
(1)任何两个查询在任何字符上的不同都会导致缓存不命中。
(2)如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。
(3)**缓存建立之后,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。
缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。 因此,开启查询缓存要谨慎,尤其对于写密集的应用来说更是如此。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十 MB 比较合适。此外,还可以通过 sql_cache 和 sql_no_cache 来控制某个查询语句是否需要缓存。**

27. 何谓事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

28.何谓数据库事务?

数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行
关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性:

  1. 原子性(Atomicity) : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性(Consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性(Durabilily): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

    29. 并发事务带来了哪些问题?

    在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
  • 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
  • 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失。
  • 不可重复读(Unrepeatable read): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
  • 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复读和幻读区别 :不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次查询同一条查询语句(DQL)时,记录发现记录增多或减少了。

30 .MySQL 的隔离级别是基于锁实现的吗?

MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。
SERIALIZABLE 隔离级别,是通过锁来实现的。除了 SERIALIZABLE 隔离级别,其他的隔离级别都是基于 MVCC 实现。
不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。

31.MySQL 的默认隔离级别是什么?

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)

32.行级锁的使用有什么注意事项?

InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中索引或者索引失效的话,就会导致扫描全表对表中的所有记录进行加锁。
不过,很多时候即使用了索引也有可能会走全表扫描,这是因为 MySQL 优化器的原因。

Mysql主键索引和普通索引的区别是什么?谁的性能更好一点?如果是在10W级数据下,谁的性能更好些?
介绍下联合索引?
以(a,b,c)为例,在什么情况下,单查b也能命中联合索引?
Mysql的数据也会丢失啊,如何保证呢?
主从复制解决了什么问题?
Mysql为什么要采用读写分离呢?
Mysql读写压力很大该则么办
覆盖索引和非覆盖索引的区别
Mysql的索引为什么那么快?有哪些索引?原理?数据结构?
Mysql有哪些优化策略?
什么是MVCC?
MVCC解决的问题是什么?
MVCC实现原理是什么?
什么是mysql的主从复制?
mysql为什么需要主从同步?
mysql复制原理是什么?
MySQL的自增 ID 用完了,怎么办?
1、 表的自增 id 达到上限后,再申请时它的值就不会改变,进而导致继续插入数据时报主键冲突的错误
2、 row_id 达到上限后,则会归 0 再重新递增,如果出现相同的 row_id,后写的数据会覆盖之前的数据