1.MYSQL中如何定位慢查询
我们当时是用了运维的监控系统skwaling,他可以查看sql中那条语句执行比较慢,还有一种方法就是,mysql中自己定义了慢日志功能,我们可以设置设置将超过几秒的sql语句给写入到慢日志中,这样就可以看出那个sql执行慢。
2.一条SQL执行很慢我们如何分析呢?
一条sql执行慢的话,我们可以使用explain执行计划分析其原因,他会将一条sql语句形成一张报表,让我们查看其状态,比如我们可以通过key和key_len来分析是否命中索引或者索引是否失效,通过type字段来确认sql是否能进一步优化,通过exter来确认是否有回表的情况。
3.了解过索引吗?索引的底层结构了解过吗?
索引是很常见的,他主要作用是为了MYSQL高效获取数据的一种数据结构,主要就是提高检索效率,降低io成本和cpu利用率。
索引的底层结构是采用innoDB的B+树,选择B+树的原因有三个:1.阶数多,路径短。2.便于扫库和区间查询。3.磁盘读写代价低,叶子节点存储数据,非叶子节点存储指针。
4.B树和B+树的区别
B树的话他的叶子节点和非叶子节点都存储数据,B+数的话,只在叶子节点存储数据,非叶子节点存储指针,而且B+树的效率更高。
5.什么是聚族索引和非聚簇索引?
聚簇索引指的是数据和索引存放到一起,B+树的叶子节点保存了整行数据,有且只有一个,一般是主键作为聚簇索引。
非聚簇索引指的是数据和索引不存在一起,B+树的叶子节点保存对应的主键,可以有多个,一般我们自定义的索引都是非聚簇索引。
6.什么是回表查询?
这个与聚簇索引和非聚簇索引有关,二级索引查找到对应的主键,主键在通过聚簇索引确定整行数据,这个过程就叫做回表。
7.什么是覆盖索引?
覆盖索引指的是用select查询语句使用了索引,在返回的列中,必须在索引中全部能够找到,如果我们使用Id查询,他会走聚集索引查询。一次扫面,直接返回数据,性能高。
8.MYSQL超大分页怎么处理?
超大分页一般是在数据量大的时候使用,我们使用了limit分页查询,并且需要对数据进行排序,这样查询效率会变低,我们可以使用覆盖索引和子查询解决。
先分页查询数据的id,确定Id之后再通过子查询过滤,只查询这个Idl列表中的数据即可。
9.索引的创建原则有哪些?
索引一般是在数据量巨大的时候使用,一般是数据量超过10万的时候就会使用索引,并且添加索引的字段都是使用比较频繁的,我们通常创建索引的时候都是通过复合索引创建的,,一条sql的返回语句尽量使用覆盖索引。
10.什么情况下索引会失效?
这个就很多了,比如没有遵循最左匹配原则,模糊查询时,%在最前面索引也会失效,使用复合索引中间使用了范围查询,右边的索引也会失效。
11.SQL优化的经验?
这个是比较常用的,sql优化考虑一下几个方面:建表的时候,使用索引的时候,sql语句的编写,主从复制,读写分离。
12.你平时对sql语句做了哪些优化?
使用select查询语句时尽量不要使用select*,要精确到字段查询。
13.事务的特性是什么?可以详细说一下嘛?
ACID:原子性,一致性,隔离性,持久性。
举个例子:A向B转账500元,转账成功A-500,B+500,原子性体现在要么都成功要么都是失败。
A转账成功后,总额是不变的,就是A-500,B+500,保持总额一致。隔离性就体现在,AB转账期间,其他事物是不能干预的。持久性就体现在,转账成功后,在不转给别人的情况下,余额是持久不变的。
14.并发事务带来了哪些问题?
并发事务带来的问题主要有三种:脏读,不可重复读,幻读。
脏读:事务A在读取数据,并且对数据进行修改,但还未上传数据库,这时事务B也在读取这个数据,因为事务A修改之后还未上床数据库,所以事务B读取的数据时不准确的,这个称为脏读。
不可重复读:一个事务A多次访问同一个数据,比如事务A两次访问数据,在完成第一次访问后,将要进行第二次访问时,事务B也在访问这个数据,并对其进行修改,事务A第二次访问时,读取到的数据与第一次不同,这叫做不可重复读。
幻读:与不可重复读相似,事务A在第一次访问之后,将要进行第二次访问时,事务B访问了该数据,并对其添加了一些数据,当事务A第二次访问的时候,发现了一些不存在的数据,这个叫做幻读。
15.怎么解决并发事务带来的问题?MYSQL默认隔离级别是?
解决并发问题就是对事务进行隔离。
隔离级别的话有四个级别:1.读未提交,他解决不了并发事务的问题。2.读已提交,他可以解决脏读问题。3.可重复读:他可以解决脏读和不可重复读问题。4.串行化:他可以解决脏读,不可重复读和幻读问题。
在日常使用中我们我们默认的级别是可重复读,因为串行化的性能比较低。
16.undo log和redo log的区别
redo log日志记录的是数据页的物理变化,当服务宕机后可以用来同步数据,而undo log是记录数据页的逻辑变化,当事务回滚时,他可以通过逆操作恢复数据。
17.事物的隔离性是如何保证的?(解释一下MVCC)
事务的隔离性是由锁和mvcc实现的
mvcc急死多版本并发控制吗,指维护一个数据的多个版本,使得读写操作没有冲突,他的底层实现分为三个部分:1.隐藏字段,2.undo log日志,3.readView读视图。
18.MYSQL主从同步原理
MYSQL主从复制的核心就是二进制日志(DDL数据定义语言和DML数据操作语言)他的步骤是这样的:1.主库在提交事务的时候,会把数据变更记录在二进制日志文件binlog中。2.从库读取主库中的binlog日志,并把他写入从库中的中继日志relay log。3.从库重做中继日志的事件,将改变反应他自己的数据。
19.你用过MYSQL的分库分表吗?
因为我们都是微服务开发,每个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分。