MySQL优化常见面试题

1.在MySQL中如何定位慢查询

  1. 采用运维的监控系统Skywalking,可以监测出哪个接口,最终因为是sql的问题
  2. 在mysql中开启慢查询日志,我们设置的值是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段)
开启MySQL慢日志查询开关
slow_query_log=1
设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=1

2.SQL语句执行很慢,如何分析

可以采用MySQL自带的分析工具explain来去查看这条sql的执行情况
● 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的可能)
● 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
● 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

3.什么是索引

● 索引是帮助MySQL高效获取数据的数据结构(有序)
● 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
● 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

4.索引的底层结构了解过嘛

● MySQL默认的存储引擎InnoDB采用的B+树来存储索引
● B+树阶数更多,路径更短
● 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
● B+树偏于扫库和区间查询,叶子节点是一个双向链表

5.B树和B+树的区别是什么

● 在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有数据都会出席那在叶子节点中,在查询的时候,B+树查找效率更加稳定
● 在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,而且叶子节点是一个双向链表

6.什么是聚簇索引什么是非聚簇索引

● 聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
● 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

7.什么是回表查询

通过二级索引找多对应的主键值,到聚簇索引中查找整行数据,这个过程就是回表

8.什么是覆盖索引

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部被找到
● 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高
● 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *

9.MySQL超大分页如何处理

问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低
解决方案:覆盖索引+子查询
select * from tb_sku limit 9000000,10
这条sql语句可以优化为
select * from tb_sku t,(select id from tb_sku order by id limit 9000000,10) a where t.id = a.id

10.索引创建原则有哪些

  1. 数据量较大(超过10万以上),且查询比较频繁的表
  2. 常作为查询条件、排序、分组的字段
  3. 字段内容区分度高
  4. 内容较长,使用前缀索引
  5. 尽量联合索引
  6. 要控制索引的数量
  7. 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

11.什么情况下索引会失效

  1. 违反最左前缀法则
  2. 范围查询右边的列,不能使用索引
  3. 不要在索引列上进行运算操作,索引将失效
  4. 字符串不加单引号,造成索引失效。(类型转换)
  5. 以%开头的Like模糊查询,索引失效

12.对sql优化的经验

表的设计优化
  1. 比如设置合适的数值(tinint int bigint),要根据实际情况选择
  2. 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低
SQL语句优化
  1. select语句务必指明字段名称(避免直接使用select *)
  2. SQL语句要避免照成索引失效的写法
  3. 尽量用union all代替union ,union会多一次过滤,效率低
  4. 避免在where子句中对字段进行表达式操作
  5. Join优化 能用innerjoin就不用left join right join,如必须使用 一定要以小表为驱动
    内连接会对两个表进行优化,优先把小表放在外边,把大表放在里边。但left join和right join,不会重新调整顺序

相关推荐

  1. MySQL优化见面试题

    2024-04-13 19:18:01       36 阅读
  2. MySQL见面试题

    2024-04-13 19:18:01       49 阅读
  3. MySQL见面试题汇总

    2024-04-13 19:18:01       47 阅读
  4. MySQL见面试题汇总

    2024-04-13 19:18:01       48 阅读
  5. MySQL--索引见面试题详解

    2024-04-13 19:18:01       47 阅读
  6. Kafka见面试题

    2024-04-13 19:18:01       58 阅读
  7. ZooKeeper见面试题

    2024-04-13 19:18:01       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 19:18:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 19:18:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 19:18:01       82 阅读
  4. Python语言-面向对象

    2024-04-13 19:18:01       91 阅读

热门阅读

  1. 深入理解负载均衡:原理及常用算法

    2024-04-13 19:18:01       36 阅读
  2. 富格林:摸清受害亏损陷阱安全预防

    2024-04-13 19:18:01       40 阅读
  3. DRBD双主模式自动化安装部署脚本

    2024-04-13 19:18:01       35 阅读
  4. Unity面经(自整)——C#基础

    2024-04-13 19:18:01       37 阅读
  5. C#多线程

    2024-04-13 19:18:01       31 阅读
  6. C# WinForm —— 06 常用控件

    2024-04-13 19:18:01       39 阅读
  7. symfony框架

    2024-04-13 19:18:01       39 阅读
  8. Docker之数据卷和Dockerfile

    2024-04-13 19:18:01       36 阅读
  9. C#实现HTTP上传文件的方法

    2024-04-13 19:18:01       43 阅读
  10. jieba分词的应用

    2024-04-13 19:18:01       40 阅读
  11. 04-springmvc-RequestContextHolder

    2024-04-13 19:18:01       42 阅读
  12. 数据仓库理论与实战

    2024-04-13 19:18:01       35 阅读
  13. 个人博客项目_09

    2024-04-13 19:18:01       33 阅读
  14. FNP preptool has not been run on this executable

    2024-04-13 19:18:01       33 阅读
  15. C#入门理解设计模式的6大原则

    2024-04-13 19:18:01       37 阅读