影响服务器性能的几个方面
- 服务器硬件
- 服务器操作系统
- 数据库存储引擎的选择
- 数据库参数的配置
- 数据库结构设计和SQL语句
SQL性能下降的原因
- 查询语句写的不好
- 索引失效
- 关联查询太多join
- 服务器调优及各个参数设置
SQL加载顺序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwKhrHYF-1577071528437)(F9EC10B5442444219DEBE37F51DF4850)]
MySql常见瓶颈
- CPU:CPU在饱和的时候一般发生在数据装入内存或磁盘读取数据的时候
- IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
- 服务器硬件的性能瓶颈
explain
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理sql语句的。
explain能做什么?
- 显示表的读取顺序
- 数据读取操作的操作类型
- 有哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
语法
explain sql语句
explain select * from jd;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | goods | NULL | ALL | NULL | NULL | NULL | NULL | 21 | 100.00 | NULL |
explain字段解释
id
表示读取顺序,即使用查询时,sql先读的那张表,再读的那张。如果id相同,执行顺序由上至下。如果id不同,id值越大优先级越高,越先被执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxzkyAAj-1577071528439)(704AD5A65C194FEABAA7253D714ED54E)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6tBPkW6-1577071528439)(44C89F67A3DA46DDBC8BB7AF072163E1)]
select_type
- simple 表简单的select查询,查询中不包含子查询和union
- primary 表最后被查询的,当查询语句中包含任何复杂的子部分,最外层查询则标记为primary
- subquery 在select或where列表中包含了子查询
- union 出现在union之后的查询表会被标记为union
- union result 从union表获取结果的select
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33jDK3Iu-1577071528440)(A118B36E2A2D45A28051BF9ACD5521F8)]
table
显示该行数据来自于哪张表
partitions
查询访问的分区
type
从最快到最慢依次是
system > const > eq_ref > ref > range > index > ALL
- system 表示只有一行记录,是content的特列
- const 该表最多有一个匹配行,按主键或唯一索引读取。由于只有一行,因此该行中列的值可以被优化器的其余部分视为常量。
- eq_ref 对于每个来自于前面的表的行组合,从该表中读取一行。用于联表查询的情况。
- ref 非唯一索引(主键是唯一索引),返回匹配某个单独值得所有行
- range 在制定范围内,使用一个索引来查找
- index 比all多了遍历索引树
- all 遍历全表找到匹配值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GduLga7l-1577071528441)(EF5824E03E464C9C9CAFFCD522C6D283)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7oqWMZkm-1577071528442)(F2BFA923BC2447B1BA564B7A2CA5AD96)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRMa4dyx-1577071528442)(4426360169AE45D9AC78CB76C02740F8)]
possible_keys
显示该表中可能用到的索引,一个或多个,也可能NULL
key
实际使用的索引,NULL表示没有使用索引。查询中如果使用了覆盖索引,则该索引仅出现在key列表中
key_len
表示索引中使用的字节数,可以得知使用索引的长度。在不损失精准性的情况下,长度越短约好。ken_len显示的值为索引字段的最大可能长度,并非实际使用长度。
ref
表示索引那一列是否被使用到
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录需要读取的行数。
extra
包含不适合在其他列中显示 但十分重要的额外信息
- using filesort 文件内排序,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取
- using temporary 使用临时表保存中间结果,mysql在对查询结果排序时使用临时表
- using index 使用了索引,避免了全表扫描
- using where 使用了where过滤
- using join buffer 使用了连接缓存
- impossible where 不可能条件,where子句的值总是false
当出现using filesort时,说明你“九死一生”,该查询语句有很大的问题,必须优化
当出现using temporary,说明“凉透了”,必须优化
using join buffer,需要优化,但问题没有上面两个严重
impossible where,说明你写的语句有问题,语法问题