1.为何要调优sql
因为某些语句执行效率缓慢,致使没法获得及时响应服务器
2.简单调优准备tcp
打开慢查询日志函数
show variables like 'slow_query_log'性能
show variables like '%log%'(查看变量设置)优化
set global slow_query_log_file = 'path'日志
set global log_queries_not_using_indexes =on索引
set global long_query_time = 1(大于1秒的查询记录下来)队列
explain 从句分析查询性能(具体参数意义可自行查询)ip
3.调优方式
1)SQL语句优化
针对max函数能够用索引优化,覆盖索引
count优化 筛选条件须要增长or null(以避免出现数据不一致状况)
子查询优化 优化成join查询 防止重复数据(1对多。须要增长去重关键字distinct)
group by优化 (默认使用临时表,因此优化方式是不要使用临时表还有文件表) inner join ( a group by a.id ) as c using(id),即创建相关索引
limit 优化 时常伴随 order by 因此须要进行文件过滤 :使用主键或者索引列进行order by操做 返回上次查询的id 而后进行id过滤、
2)索引优化
创建合适的索引
where从句 group by从句 order by从句 on从句出现的列适合增长索引
索引的字段越小越好
离散度大的列放到联合索引前面
索引优化sql的方法(增长索引有利于查询,不利于写入,避免重复索引,冗余索引,索引变动会带来问题,须要注意)
3)数据表结构优化
选择合适的数据类型
存下数据的最小类型
使用简单的数据类型
尽量的使用notnull定义字段
尽可能少用text类型,非用不可的时候考虑分表
范式化和反范式化(第三范式)
反范式化 : 空间换时间
删除异常 ,更新异常 方式: 表拆分
表结构的垂直拆分
把原来有不少列的表拆分红多个表
解决了表宽度的问题
把大字段独立存放到一张表中
把不经常使用字段单独存放到表中
把经常使用字段存放在一块儿
表结构的水平拆分
解决表的数据量大
表结构相同
数据均分方法(HASH)
问题:跨表进行数据查询,统计及后台报表操做(解决方法:先后台查询分开)
4)系统优化
增长tcp支持队列数
net.ipv4.tcp_max_syn_backlog=65535
减小断开链接时,资源回收
net.ipv4.tcp_max_tw_buckets=8000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=10
打开文件数限制
关闭防火墙
(硬件防火墙)
5)服务器硬件优化