Mysql的sql优化企业里边主要是对慢sql进行优化,对语句进行优化,对索引进行优化
通过explain查看sql的详细信息,并且分析sql语句存在的问题,比如有没有使用到索引、使用了索引还是慢是不是索引设置的不合理、没有显示使用到索引是不是触碰了索引失效的规则。
使用explian的方法也就是在sql前边加上explian.
union result :连接查询结果
table:查询的表名称
type:连接类型
system:只有一行,或者是空表
const:唯一索引或者主键
eq_ref:唯一索引扫描
ref:非唯一索引扫描
range:索引范围扫描
index:使用到了索引
all:全表扫描
Using index:where后使用到了索引,会出现Using index;Using Where
Using join buffer:连接缓存
1.对索引进行优化
2.查询语句加上limit优化sql,查询数据若只有一条,使用limit可以限制全表扫描
3.能不使用子查询就不使用,可以使用连接代替子查询的就是用连接查询,因为子查询会创建临时表,查询完毕之后会将临时表删除,创建跟删除的过程是不可避免的,势必会降低查询时间
4.如果需要关联查询,连接的字段最后建立索引
数据库优化:开启慢查询优化日志、配置连接数、数据库结构优化
开启慢查询优化日志,存在慢查询的时候开启日志,然后分配慢查询日志,平时的时候不建议开启,日志的查看需要在用户下边,而不是在mysql里边。
- [root@localhost ~]# mysqldumpslow -s t /var/lib/mysql/localhost-slow.log
-
- Reading mysql slow query log from /var/lib/mysql/localhost-slow.log
- Count: 1 Time=77.12s (77s) Lock=0.00s (0s) Rows=0.0 (0), root[root]@[192.168.200.1]
- select tk.id,ts.* from tb_seckill_goods ts LEFT JOIN tb_sku tk ON tk.id=ts.id where ts.id>N order by ts.price
-
- Count: 1 Time=2.00s (2s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@[192.168.200.1]
- select sleep(N)
配置这个连接数,就跟连接池一样使用的池化思想,但是也不能设置过高,要根据cpu核数,任务处理时间来合理配置
- # 查看 max_connections
- show global variables like '%max_connections%'
- # 设置 max_connections(立即生效重启后失效)
- set global max_connections = 800;
提升硬件设备,例如选择尽量高频率的内存(频率不能高于主板的支持)、提升网络带宽、使用SSD高速磁盘、提升CPU性能等。CPU的选择:cpu决定并发,决定处理能力