通用性能优化口诀
- 缓存
- 异步
- 批处理
应用层次
- 针对 innodb 存储引擎
写操作
- 批量 insert
- 减少 sql 编译的时间和空间复杂度
- 减少网络消耗的时间复杂度
- 减少磁盘寻址
- 批量 update
读操作
- 用 索引
查询类型 | 记录规模 | 消耗时间 |
---|---|---|
主键索引 | 千万 | 1-10ms |
唯一索引 | 千万 | 10-100ms |
非唯一索引 | 千万 | 100-1000ms |
无索引 | 百万 | 1s + |
MySQL 配置
单机
max_connection=1000
- 连接数量,默认 100
- 如果我们的应用了连接池,是由最小连接数量的,比如 5
- 部署了多个应用后,各个应用的最小连接数会消耗 mysql 的连接池数量
- 比如这里第 21 个后就无法连接了
innodb_file_per_table=1
- 开启独立表空间, mysql 5.6 之后默认开启
- 优点:
- 每个表都有自己独立的表空间。
- 每个表的数据和索引都在自己的表空间中。
- 可以实现单表在不同的数据库中移动。
- 空间可以回收
- 性能优势(除insert共享表空间略有优势外,其他方面独立表空间都表现更好)
innodb_buffer_pool_size=4G
- innodb 存储引起的 buffer_pool
innodb_flush_log_at_trx_commit=2
- 事务提交后, redo 日志的刷盘策略
innodb_log_file_size=256M
- 日志文件大小,当日志文件达到阈值后,会切割日志
- 此时无法写日志,刷盘可能会出问题
- 但是如果设置太大,会导致恢复时对日志文件的寻址很久
innodb_log_buffer_size=16M
- 日志文件缓存的大小 (redo?)
innodb_data_file_path=ibdata1:1G;ibdata2:1G;ibdata3:1G:autoextend
- 实际数据文件大小
- 这里指定前三个日志文件的大小,后面就自动扩展
其他
- 慢查询的开启和捕获
- explain + 慢 sql 分析
- show profile 查询 sql 在 mysql server 中的执行细节和生命周期情况
- sql 数据库服务器的参数调优