MySQL篇
一、在MySQL中如何定位慢查询:
1.使用开源工具:
调试工具:Arthas
运维工具:Prometheus、Skywalking
2.MySQL自带的慢日志:
慢查询日志记录了所有执行时间超过指定参数(long_query_time单位为秒,默认值为10)的所有SQL语句的日志,如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
a.slow_query_log=1:开启MySQL慢日志查询开关
b.long_query_time=2:设置慢日志的时间为2秒,SQL语句执行时间超过2秒就会被视为慢查询,记录慢查询日志
配置完毕后,通过指令重新启动MySQL服务器进行测试并查看慢日志文件中的记录信息
二、某条SQL语句执行很慢,如何分析?
可以使用EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息:
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件
possible_key:当前sql可能会使用到的索引
key:当前sql实际命中的索引
key_len:索引占用的大小
通过key和key_len查看是否可能会命中索引
Extra:额外的优化建议
Extra | 含义 |
Using where;Using Index | 查找使用了索引,需要的数据都在索引列中可以找到,不需要回表查询数据 |
Using index condition | 查找使用了索引,但是需要回表查询数据 |
type:sql的连接类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all
system:查询系统中的表
const:根据主键查询
eq_ref:主键索引查询或唯一索引查询
ref:索引查询
range:范围查询
index:索引树扫描
all:全表扫描
三、索引:
索引是帮助MySQL高效获取数据的数据结构(有序),在数据之外数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引
数据结构对比:
MySQL默认使用的索引结构底层数据结构是B+树,B+Tree是在BTree上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构
B树和B+树的对比:
磁盘读写代价B+树更低,查询效率B+树更加稳定,B+树更便于扫库和区间查询
聚簇索引和非聚簇索引:
分类 | 含义 | 特点 |
聚簇索引 | 将数据存储与索引放到了一起,索引结构的叶子结点保存了行数据 | 必须有且只能有一个 |
二级索引(非聚簇索引) | 将数据与索引分开存储,索引结构的叶子结点关联的是对应的主键 | 可以存在多个 |
聚簇索引选取规则:
(1).如果存在主键,主键索引就是聚簇索引
(2).如果不存在主键,将使用第一个唯一索引作为聚集索引
(3).如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚簇索引
回表查询:
通过二级索引找到对应的主键值,到聚集索引中查找整行数据