Mysql数据库

发布时间 2023-08-18 17:44:01作者: Wyman歪曼

 问题1:如何定位Mysql慢查询?

分析:聚合查询、多表查询、表数据量过大、深度分页查询,导致页面加载慢、接口压测响应时间超过1s。

答:A使用开源运维工具,比如Arthas、SkyWalking;B使用Mysql自带的慢查询日志,调试阶段使用;

 问题2:SQL执行慢,是如何分析优化的呢?

  聚合查询,加临时表

  多表查询,优化sql语句

  表数据量过大,添加索引

  深度分页查询,

通过执行计划来分析,EXPLAIN / DESC命令来查看执行计划

 

 

 说下Mysql数据库的索引,什么是索引?

  索引(index)是帮助MySQL高效获取数据的数据结构(有序)

  提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
  通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

说下索引的底层数据结构?

MySQL的InnoDB引擎采用的B+树的数据结构来存储索引
  阶数更多,路径更短
  磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据

   B+树便于扫库和区间查询,叶子节点是一个双向链表

  对比数据结构(二叉树、红黑树、B树、B+树)

样么是聚族索引件么是非聚族索引?
  聚簇索引(聚集索引):数据与索引放到一块,B+的叶子节点保存了整行数据,有且只有一个。 

    聚集索引选取规则:
    如果存在主键,主键索引就是聚集索引。
    如果不存在主键,将使用第一个唯一 (UNIQUE) 索引作为聚集索引。Y
    如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

  非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

知道什么是回表查询嘛?
  通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表

  select * from user where name = Arm';//name有索引,先走二级查询找到主键,再走一级索引。

 知道什么叫覆盖索引嘛 ?

   覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到

  优化方案:使用主键id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*

 MYSQL超大分页怎么处理?

问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低解决方案:覆盖索引+子查询

select * from tb sku t, (select id from tb sku order by id limit 9000000,10) a
where t.id = a.id;

 索引创建原则有哪些?

  1).数据量较大比如10+,且查询比较频繁的表            重要
  2)常作为查询条件where、排序order by、分组group by的字段    重要

  3).字段内容区分度高
  4).内容较长,使用前缀索引
  5)减少单列索引,尽量联合索引,很多时候可以成为覆盖索引,避免回表查询提高效率 重要
  6)要控制索引的数量,越多维护索引结构代价就大,增删改效率差          重要
  7)如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

 什么情况下索引会失效? 通常指的是联合索引失效问题

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

 谈一谈你对sql的优化的经验

  表的设计优化,数据类型的选择
  索引优化,索引创建原则
  sql语句优化,避免索引失效,避免使用select* ....
  主从复制、读写分离,不让数据的写入,影响读操作
  分库分表