MYSQL数据库知识点回顾(一)

97 阅读10分钟

【1】MYSQL、ORACLE的默认端口号

3306、1521

【2】MyISAM和InnoDB的区别

①Mysql5.5之前默认的存储引擎是MyISAM,在5.5之后,默认的存储引擎是InnoDB。

②MyISAM支持表级锁,不支持事务、行级锁、外键,InnoDB支持事务、表级、行级锁、外键。

③MyISAM崩溃后无法恢复,而InnoDB可以。

④MyISAM不支持MVCC,而InnoDB支持。

【3】什么是事务?

事务是逻辑上的一组操作,要么都成功,要么都失败。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

【4】事务的四大特性(ACID)

原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部成功,要么全部失败;

一致性(Consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;

隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

【5】并发事务带来哪些问题?

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

脏读:
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是

“脏数据”,依据“脏数据”所做的操作可能是不正确的。

幻读:
幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2
)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复读:
指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

【6】不可重复读和幻读区别

不可重复读的重点是修改,比如多次读取一条记录发现其中某些列的值被修改。

幻读的重点在于新增或者删除,比如多次进行条件查询发现记录增多或减少了。

【7】事务隔离级别有哪些?

READ-UNCOMMITTED读未提交:允许读取尚未提交的数据,可能导致脏读、幻读、不可重复读。

READ-COMMITTED读已提交:允许读取已经提交的数据,未提交的事务不允许读取,可以防止脏读,但是幻读和不可重复读仍有可能发生。

REPEATABLE-READ可重复读:对同一记录的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以防止脏读、不可重复读,但是幻读仍有可能出现。

SERIALIZABLE串行化:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,防止脏读、幻读、不可重复读。

隔离级别

脏读

不可重复读

幻读

READ-UNCOMMITTED

READ-COMMITTED

×

REPEATABLE-READ

×

×

SERIALIZABLE

×

×

×

【8】InnoDB引擎默认的隔离级别

REPEARTABLE-READ可重复读,可以避免脏读和不可重复读,而InnoDB引擎中不存幻读的情况,所以使用REPEATABLE-READ隔离级别即可实现事务的隔离性要求。

【9】MyISAM和InnoDB存储引擎使用的锁分别是

MyISAM使用表级锁。InnoDB支持行级锁和表级锁,默认使用行级锁。

【10】表级锁和行级锁区别

表级锁:对当前操作的整张表加锁,加锁快,不会出现死锁,锁冲突概率最高,并发度最低。

行级锁:只对当前操作的行进行加锁,加锁慢,会出现死锁,锁冲突概率最低,并发度最高。

补充:

页级锁:MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。页级进行了折衷,一次锁定相邻的一组记录。

加锁速度

是否出现死锁

锁冲突概率

并发度

表级锁

不会

行级锁

页级锁

【11】什么是死锁

当两个事务都需要对方持有的锁,导致双方都进入了阻塞状态,这就导致了死锁。当InnoDB
检测到死锁发生时,会使一个事务释放锁并回滚事务,另一个事务则可以获得锁完成事务。

【12】如何避免死锁

①使用表级锁替代行级锁。

②当一个线程发现需要申请的资源被加锁了之后,就释放自身拥有的资源。

③多个线程尽量约定以相同的顺序访问资源。(哲学家就餐问题的一种解决思路)。

④同一个事务尽可能做到一次锁定所需要的所有资源。

【13】当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施(大表优化)

①限定数据的查询范围。务必禁止不带任何限制数据范围条件的查询语句。比如:当用户在查询订单历史的时候,我们可以控制在一个月的范围内;

②读写分离(主从模式)。经典的数据库拆分方案,主库负责写,从库负责读;

③垂直分区。垂直分区是指数据表列的拆分,把一张列比较多的表拆分为多张表。

④水平分区(集群cluster)。保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。

水平拆分可以支撑非常大的数据量。

【14】解释一下什么是池化设计思想?池化设计思想解决了什么问题?什么是数据库连接池?数据库连接池解决了什么问题?

我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。这种设计会初始预设资源,解决的问题就是抵消每次获取资源(连接对象)的消耗,如创建线程的开销,获取远程连接的开销等。就好比去食堂打饭,打饭的大妈会先把饭盛好几份放那里,你来了就直接拿着饭盒加菜即可,不用再临时又盛饭又打菜,效率就高了。除了初始化资源,池化设计还包括如下这些特征:池子的初始值、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。

数据库连接本质就是一个socket的连接。我们可以把数据库连接池看做是维护的数据库连接对象的缓存,以便将来需要对数据库的操作时可以重用这些连接对象。减少了用户必须等待与数据库建立连接的时间。

【15】分库分表之后,id主键如何处理?

①数据库自增id:两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。这种方式生成的id有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。

②利用redis生成id:性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。

③利用UUID唯一标识码。

【16】索引的原理

索引是高效获取数据的数据结构。比如一本书的目录,就是这本书内容的索引,读者可以通过目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。

【17】sql优化

①对查询进行优化,要尽量避免全表扫描,考虑在where及order by涉及的列上建立索引。

②应尽量避免在where子句中使用!=操作符、null值判断,否则引擎将放弃使用索引而进行全表扫描。

③应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。

④应尽量避免在where子句中对字段进行聚合函数操作,这将导致引擎放弃使用索引而进行全表扫描。

⑤查询表记录时,使用count(1)来替代count(*)。

⑥任何地方都不要使用select * from t,用具体的字段列表代替“*”,并且不要返回用不到的任何字段。

【17】B+Tree的好处

①查询涉及的磁盘IO次数少(内节点不包含数据,内节点出度大,树的高度小)

②查询效率稳定(每次查询路径长度相同,只有叶节点存储数据,并且叶节点在同一层上)

③遍历和区间查询效率高(从符合条件的某个叶子节点开始遍历即可)

【18】BTree和B+Tree的区别

①B+Tree是BTree的改进版,使得所有内节点只用做索引,而数据都存储在叶节点上,使得内节点可以存储更多的索引,因为内节点有更多的出度,使得树的高度降低,提高了查询的效率。

②B+Tree的遍历/区间查询操作比BTree方便,BTree遍历数据时需要遍历整棵树,而B+Tree只需遍历叶子节点即可,因为叶子节点之间形成了一个单链表。

【19】数据库索引(mysql)为什么不使用红黑树而使用B+Tree?

索引一般以索引文件存储在电脑磁盘上,并且索引文件一般很大,不能一次性将所有的索引读取到内存中,导致查询记录时需要多次IO,而IO操作是非常耗性能的,所以在选择索引的数据结构时,应该尽可能的降低IO次数为佳,对于相同记录数,红黑树的高度一般要比B+Tree要高,换言之红黑树的IO次数会比B+Tree要多,性能不如B+Tree,所以索引使用B+Tree而不使用红黑树。

PS:红黑树是自平衡二叉搜索树、BTree是多路搜索树、B+Tree是BTree的改进版,也是多路搜索树。