Mysql

时间:2024-10-24 10:41:33

在Mysql里边如何定义慢查询

在Skywalking展示的报表中可以看到哪一个接口比较慢 从而定位出是哪一个接口出现问题

或者在Mysql中也可以根据慢查询日志的功能 设置sql语句超过多少执行时间就把这条语句记录到日志里边

如果sql语句很慢 怎么分析

通常使用mysql自动的执行计划explain来去查看这条sql的执行情况 比如可以通过key或者key_len

检查是否命中了索引 如果已经添加了索引 也可以判断索引是否有失效的情况

还有通过type字段来查看sql是否有进一步的优化空间  是否存在全索引扫描 或者全盘扫描

第三个可以通过extra建议来判断 是否出现了回表的情况 如果出现了可以尝试添加索引或者修改返回字段修复

什么是索引

索引帮助MySql高效获取数据的数据结构 主要是用来提高数据检索的效率 降低数据库的IO成本 同时通过索引列 对数据进行排序 降低数据排序的成本 也能降低CPU的消耗

索引的底层数据接结构

默认B+树

优点

阶数多 路径端

非叶子节点不存数据 所以磁盘读写代价低

叶子结点是双向链表 便于扫库和区间查询

B树和B+树的区别

B树非叶子结点和叶子节点都会存储数据 查询的时候 B+树的效率更加稳定

B+的查询效率也高 因为叶子节点存数据 而且叶子结点是一个双向链表

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

聚簇索引 数据和索引放在一起 一般主键作为聚簇索引 B+树的叶子节点保存了整行数据

非聚簇节点是数据与节点分开 一般B+树的叶子节点保存对应的主键  可以有多个  一般自己定义的索引都是非聚簇索引

什么是回表查询

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

如果问到回表 需要先介绍聚簇索引和非聚簇索引

什么是覆盖索引’(还是不理解

覆盖索引是指 select查询语句使用了索引 在返回的列 必须在索引中全部都能找到 如果id查 会直接走聚簇索引 一次索引扫描 直接返回数据 性能高

就是如果二级查询可能会触发回表查询 尽量避免使用select* 尽量在返回的列中 都包含添加索引的字段

MYSQL超大分页怎么处理

如果使用limit分页处理的话  还需要对数据排序 效率比较低 

可以采用覆盖索引和子查询解决

先分页查询数据的id字段  确定id之后  再用子查询来过滤

因为查询id 的时候走的覆盖索引 所以效率会高很多

索引创建原则

数据超过·10万条

并且添加索引的字段一般也是查询非常频繁的字段

通常创建的索引都是用复合索引 sql返回值尽量使用覆盖索引

如果区分度不高的话 会把它放在组合索引的后边

字段内容较长考虑添加前缀索引 并不是所有的字段都要添加索引 索引的数据也要控制

索引失效的情况

索引没有遵循最左匹配原则

模糊查询的时候%放在了最前面

索引上加了运算或者类型转换

判断是否失效可以通过explain执行计划来分析

有个情况  如果使用了复合索引 中间使用了范围查询 右边的条件索引也会失效

sql优化

建表 使用索引 写sql语句 主从复制 读写分离 还有就是量比较大的时候考虑分库建表

创建表的时候怎么优化

根据实际情况分析  选择合适的数据类型

使用索引优化sql

回答参考索引的创建原则

平时优化sql语句

少用 select *

unionALL 》 union

innerjoin 代替 left join  right join

并发事务带来的问题

脏读 不可重复读  幻读

怎么解决

对事务进行隔离

隔离级别 未提交读 读已提交 可重复读 串行化

mysql默认隔离级别 可重复度

undo和redo log 的区别

redo记录数据页的物理变化

undo记录逻辑日志

redo保证持久性 undo保证了事务的原子性和一致性

解释一下隔离性

隔离性是通过锁和mvcc实现的

mvcc  多版本并发控制

隐藏字段 undo  读视图readview

MySQL主从同步原理

DDL和DML

分库分表 水平分库和垂直分库

垂直分库就是 比如微服务 一个微服务一张表

水平分库 就是一个微服务一张表 但是数据量越来越大 这一张表 再水平分成三张表 可以提高性能的同时缓解数据库的压力