跳至主要内容
java
正在加载画板阅读器...

Mysql篇

·5 分钟阅读·1 次阅读#java#backend

Mysql#


优化#


面试官:什么情况下索引会失效?#

答 候选人:嗯,这个情况比较多,我说一些自己的经验,以前遇到过的: 比如,索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索 引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。 我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效

所以,通常情况下,想要判断出这条sgl是否有索引失效的情况,可以使用explain执行计划来分析


面试官:sql的优化的经验#

答 候选人:嗯,这个在项目还是挺常见的,当然如果直说sql优化的话,我们会从这几方面考虑,比如 建表、使用索引、sql语句的编写、主从复制,读写分离,还有一个是如果量比较大的话,可以 考虑分库分表

面试官:创建表的时候,你们是如何优化的呢?

候选人:这个我们主要参考的阿里出的那个开发手册《嵩山版》,就比如,在定义字段的时候需要结 合字段的内容来选择合适的类型,如果是数值的话,像tinyint、int、bigint这些类型,要根据实际情况 选择。如果是字符串类型,也是结合存储的内容来选择char和varchar或者text类型

面试官:那在使用索引的时候,是如何优化呢?

候选人:【参考索引创建原则进行描述】

面试官:你平时对sql语句做了哪些优化呢?

候选人:嗯,这个也有很多,比如SELECT语句务必指明字段名称,不要直接使用select* ;还有就是要 注意SQL语句避免造成索引失效的写法;如果是聚合查询,尽量用union all代替union,union会多一次 过滤,效率比较低;如果是表关联的话,尽量使用inner join,不要使用用left join right join,如必须使 用一定要以小表为驱动


事务#


面试官:事务的特性是什么?可以详细说一下吗?#

答 候选人:嗯,这个比较清楚,

ACID,分别指的是:原子性、一致性、隔离性、持久性;

我举个例子: A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败 在转账的过程中,数据要一致,A扣除了500,B必须增加500 在转账的过程中,隔离性体现在A像B转账,不能受其他事务干扰 在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)

面试官:并发事务带来哪些问题?#

答 候选人:我们在项目开发中,多个事务并发进行是经常发生的,并发也是必然的,有可能导致一些问题

第一是脏读,当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中, 这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的 这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。

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

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

面试官:怎么解决这些问题呢?MySQL的默认隔离级别是?

候选人:解决方案是对事务进行隔离

MySQL支持四种隔离级别,分别有: 第一个是未提交读read uncommitted)它解决不了刚才提出的所有问题,一般项目中也不用这 个。第二个是读已提交read committed)它能解决脏读的问题的,但是解决不了不可重复读和幻读。 第三个是可重复读repeatable read)它能解决脏读和不可重复读,但是解决不了幻读,这个也是 mysql默认的隔离级别。第四个是串行化serializable)它可以解决刚才提出来的所有问题,但是由于 让是事务串行执行的,性能比较低。

所以,我们一般使用的都是mysql默认的隔离级别:可重复读

S

Seal 的个人博客,记录技术探索与日常思考。

所有文章