MySQL拷打第一讲!!!
1. MySQL中如何定位慢查询定位慢查询一般有两种方式。第一种是通过应用层监控和链路追踪。比如我们项目压测时发现某些接口响应超过 2 秒通过 SkyWalking 可以看到接口的调用链路进一步分析 Controller、Service、数据库访问这些环节的耗时。如果发现某条 SQL 执行时间特别长就可以定位到具体的慢 SQL。第二种是使用 MySQL 自带的慢查询日志。可以开启slow_query_log然后通过long_query_time设置慢 SQL 阈值比如我们项目设置的是 2 秒。超过这个时间的 SQL 会被记录到慢查询日志文件中。定位之后如果要继续分析原因我会再用EXPLAIN查看执行计划看是否走索引、扫描行数是否过多等。2. 那这个SQL语句执行很慢如何分析呢如果一条 SQL 执行很慢我通常会先用EXPLAIN查看执行计划。重点看possible_keys和key判断是否有可用索引以及最终有没有真正走索引再看type如果是ALL说明可能是全表扫描如果是index说明是全索引扫描通常还有优化空间。然后看rows判断预估扫描行数是否过多看key_len判断联合索引使用到了哪些字段。最后看Extra比如是否出现Using filesort、Using temporary以及是否有Using index覆盖索引。根据结果再考虑添加或调整索引、避免索引失效、减少select *或者改写 SQL。3. 了解过索引吗什么是索引索引是 MySQL 用来提高查询效率的一种数据结构InnoDB 中常见的是 B 树索引。没有索引时查询可能需要全表扫描有索引后可以通过索引快速定位数据减少扫描行数和磁盘 I/O。索引本身是有序的所以也可以在一些排序、分组场景中减少额外排序。但索引会占用空间并且写入、更新、删除时需要维护索引所以不是越多越好。顺序是什么-好处-坏处4.索引的底层数据结构了解过吗MySQL 默认存储引擎 InnoDB 中索引底层常用的是 B 树。B 树是一种多路平衡树一个节点可以存放多个索引项所以树的高度比较低查询路径更短磁盘 I/O 次数更少。并且 B 树的非叶子节点只存索引键和指针不存完整数据因此同一页能容纳更多索引项。B 树的叶子节点之间是有序连接的所以适合范围查询和排序扫描。另外在 InnoDB 中主键索引的叶子节点存整行数据普通索引的叶子节点存索引字段和主键值。顺序是什么-好处(节点)5. B树和B树的区别是什么呢B 树和 B 树的主要区别在于B 树的非叶子节点和叶子节点都可以存放数据而 B 树的非叶子节点只存索引 key 和指针真正的数据都存放在叶子节点。这样 B 树的非叶子节点可以放更多索引项树高更低查询时磁盘 I/O 更少。另外,B 树所有数据都在叶子节点所以查询路径更稳定并且叶子节点之间是有序连接的因此更适合范围查询和顺序扫描。