mysql相关题目

56 阅读3分钟

mysql类型题目一般有两个大部分,我们把他分层优化和其他面试题。

关于优化,又分成定位慢查询,sql执行计划,所以,sql优化经验。

其他又包括事务相关内容,主从同步原理,分表分库

如何定位慢查询?

慢查询来源:聚合查询、分表查询、表数据量过大查询、深度分页查询

慢查询表现:页面加载过慢,接口响应时间长

  1. 使用一些开源工具,比如:Arthas,Prometheus,Skywalking
  2. 使用mysql自带的慢日志(在mysql配置文件 /etc/my.cnf 里面开启)
  • 慢日志记录了所有执行时间超过我们指定参数的sql语句。

  • 开启慢查询开关 slow_query_log=1

  • 设置慢日志的时间2s,即sql语句查询时间超过2s就会被认为是慢查询 long_query_time=2

配置完毕之后,需要重启mysql进行测试。查询/var/lib/mysql/localhost-slow.log日志。

如何分析慢sql

开源采用explan或者desc命令,获取mysql如何执行sql的信息

image.png

  1. 第一个关键的:possible_keys:当前sql可能用的索引
  2. key:当前sql命中的索引
  3. key_len当前所有占用大小 (通过2,3可以查询是不是会被命中)
  4. extra:额外优化建议

image.png

  1. type: sql链接性能由好到坏:null,system(系统里面的表),const(主键查询),eq_ref(主键或者唯一索引),ref(索引查询),range(范围查询),index(索引树扫描),all(全盘扫描)

索引

  • 索引是帮助mysql进行高效获取数据的数据结构(有序)
  • 提高数据的检索效率,减低数据库的io成本
  • 提高索引列进行排序,降低数据排序的成本,减少cpu消耗

Innodb底层B+树来存储索引:选择b+树是因为第一解答更多,路径更短。磁盘读写代价b+树更低,非叶子结点只存储指针,叶子结点存储数据,方便扫库和区间查询。叶子结点是一个双向链表

  1. 聚集索引:把数据和索引放在一块,索引叶子结点保留了行数据(只有一个)
  2. 二级索引:数据和索引分开存储,索引结构的叶子结点管理对应主键(可以多个)

聚集索引选取规则:

  • 如果有主键,主键就是聚集索引
  • 如果没有主键,使用第一个唯一索引作为聚集索引
  • 如果没有主键也没有核酸的唯一索引,Innodb会自动生成一个rowid作为隐藏的聚集索引

回表查询:通过二级索引找到主键值,再回到聚集索引里面寻找整行数据的过程就是回表

覆盖索引:使用了索引,返回的列必须在索引里面能够找到(因为聚集索引查询结构是一行,那么就能包括所有字段,我们就能异常拿到,但是如果是其他索引,我们可能会涉及到回表重查,就会损耗性能)

索引失效:违反最左原则,范围查询右边的条件,索引列上进行运算,字符串没有添加单引号

sql优化

  1. 表的设计优化:参考案例的开发手册
  2. 使用索引优化
  3. sql语句优化:比如减少使用select *,避免索引失效的写法,小表驱动
  4. 分表分库
  5. 主从查询

事务相关内容

事务特性:ACID 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把索引的操作作为一个整体一起向系统提交或者测序操作的请求,即这些操作要么超过要么失败

image.png 并发事务:脏读、不可重复读、幻读

image.png 关于DML、TCL、DDL - 掘金 (juejin.cn)