定位优化位置
开启慢查询记录功能
slow_query_log=1 // 开启慢查询
long_query_time=1 // 慢于 1s 的记录,一般访问量大的生产环境要慢于 0.1s
slow_quey_log_file=2019_slow.log // 文件位置
log_queries_not_using_indexes=1 // 记录没有使用索引的语句
使用工具查看慢查询日志
使用的工具
- mysqldumpslow slowlog_file_name | more
- pt-query-digest
主要优化的语句:
- 查询次数多且查询时间长
- IO 大的 sql // rows examine 扫描行数多
- 索引效率低 // rows sent/rows examine 比值小的。
使用 explain 分析语句
参数释义:
type : 查询类型
- const // 常数查找。一般主键,唯一索引会用到。
- eq_reg // 主键,唯一的范围查找
- ref // 连接查找
- range // 索引范围查找
- index // 索引扫描
- all // 表扫描
possible_key : 可能用到的索引
key : 实际使用的索引。
key_len : 索引的长度,越小越好
ref : 使用的索引的那一列
rows : 扫描的行数
extra : 如果为 using filesort 或者 using temporary (使用临时表) ,就需要优化查询了。
优化方法
索引
建立索引以及优化
create index index_name on table_name(column_name)
- where , groupby , order by , on 从句使用的列应该建立索引。
- 索引字段越小越好。
- 离散程度大的索引放在联合索引的前面。
- 删除不常使用的索引。
- 避免索引重复以及冗余。
- 模糊匹配的时候,% 不要放头部。
- 索引列不要参与计算
检查索引的使用情况
- pt-duplicate-key-checker -uroot -proot // 查找重复以及冗余索引
- pt-index-usage // 索引维护工具
数据结构优化
字段优化
- 多用整形,如 int。
- 使用 not null + 默认值
- 少用 text ,无法避免的话,分表处理。
表的第三设计范式和反范式
范式:尽量把重复的内容放在一个表里,类似于商品表,分类表,商品_分类表。
反范式:对部分表增加多余字段以减少查询目的(空间换时间)
表的垂直拆分
- 不常用的字段放入一张表中
- 大字段放入一张表中
- 经常使用的字段放入一张表中
表的水平拆分
受限于目前的业务,仅说说我了解到的内容。
对 id 根据数据表的数量取模存入。
系统配置优化
mysql 配置优化
- 查找配置文件: /usr/sbin/mysqld –verbose –help|grep -A 1 ‘Defautl options’;
- 如果存在多个配置文件,则后面的覆盖前面。
innodb_file_per_table=On // 不共用表空间
innodb_buffer_pool_instances // 设置缓冲池的个数,一般等于核数
innodb_buffer_pool_size // 一般设置为内存的 75%(当前服务器仅作为数据库且引擎为 innodb)
操作系统优化
系统配置:
网络: /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog=65535 // 增加 tcp 的数量
// 加快资源回收
net.ipv4_tcp_max_tw_buckets=8000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_fim_timeout=10
文件:/etc/security/limits.conf
soft nofile 65535
hard nofile 65535
硬件配置:
- cpu 主频越高越好,但是 cpu 的核数不一定越多越好。
- 使用 ssd 加快 IO 访问。
- 使用更大的内存来保证 mysql 缓冲区更大。
其他:关闭 iptables,selinux 等防护软件,用硬件隔离代替。
扩展
- desc table_name // 查看表结构
- count(*) = count(id OR null)
- distinct // 忽略重复
- tail -10 test.txt // 查看文件的最后 10 行
- mysql 控制台中,语句 + \G ,可以将结构选择 90 度变为纵向。
- | more // 可以翻页查看内容。
做人不可以太低下,因为父亲曾经把你举过头顶;难过时也要记得笑,因为妈妈许的愿是希望你天天开心。
—— 每个孩子都是父母的宝贝