MySQL常见问题

本文详细介绍了数据库事务的概念及其ACID特性,并解释了不同类型的锁如何影响并发操作,包括死锁现象及其预防措施。此外,还探讨了索引的工作原理、类型及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是事务,它的特性是什么?

事务是指作为单个逻辑工作单元的一系列操作(一系列SQL语句)。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据(脏读、非重复读、幻像读、丢失修改的异常情况),破坏数据库的一致性。

“A向B支付50”

  1. 读出A支付宝余额(100)。

  2. A支付宝扣钱操作(100-50)。

  3. 结果写回A账号(50)。

  4. 读出B支付宝余额(100)。

  5. B支付宝做加法操作(100+50)。

  6. 结果写回B支付宝(150)。

事务的四个特性:

原子性:事务必须是原子工作单位。对于数据的修改,要么全部执行,要么全部不执行。以上六个步骤,要么都执行,要么都不执行;

一致性:事务在完成时,所有的数据必须保持一致状态。比如:A转支付前(100)+B收款前(100)=A支付完成后(50)+B收款后(150);

隔离性:并发事务对数据的修改于其他并发事务对数据的修改是隔离的。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。比如:在A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。

持久性:事务完成后,对系统的影响是永久的。一旦转账成功,变化就真实存在了。

2、什么是死锁。产生死锁的原因,避免死锁的方法。

MySQL有三种锁的级别:页级、表级、行级。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

死锁就是两个或多个事务在同一个资源上相互占用,并且请求锁死对方的资源。

避免死锁的方法:一个事物经量一次锁定所用资源;表级锁;并发存取多个表时,以相同顺序访问。

3、索引

索引就是对表格一列或者多列进行排序的一种结构

索引类型:

主键索引(PRIMARY KEY,每张数据表只能存一个主键);

唯一索引(UNIQUE KEY,可以保证记录的唯一性);

普通索引(INDEX);

全文索引(FULLTEXT)。

最左前缀(最左优先):where 子句使用最频繁的一列放在最左边

常见索引算法:BTree(用在>、<、>=等比较操作符),Hash(用在=对等比较符)。且Hash索引检索比BTree索引检索效率高。

索引设计:适用于索引的列出现在where子句中的列;用短索引;不要过度使用索引。

优点:可以实现快速查询;

缺点:降低更新表的速度;建立索引会占用磁盘空间的索引文件。

4、脏读,不可重复读,幻读

脏读:A事务读取了B事务更新的数据,但是B回滚了,那么A就是脏读。

不可重复读:A事务重复读取同一数据多次,在A事务读取的过程中,B事务对该数据进行更新并提交,导致A事务读取的数据不一致。

幻读:A事务对表格进行整体优化(评等级),B事务在A事务优化过程中插入一行新的记录,导致A事务完成后发现还有记录没有优化完成,就好像发生幻觉一样。

5、sql生命周期

  1. 客户端服务器和数据库服务器创建连接
  2. 数据库进程拿到请求sql
  3. 解析并生成执行计划并执行
  4. 读书数据放入内存中并进行逻辑处理
  5. 发送结果给客户端服务器
  6. 关闭连接,释放资源

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值