环境
- MySQL 5.7.13
 
MySQL 优化:硬件
- CPU:使用多核 CPU,能够充分发挥新版 MySQL 多核下的效果,建议 4 核以上
 - 内存:如果数据量比较大,建议使用不要低于 20 G 内存的服务器
 - 硬盘:SSD 硬盘,提高 TPS,选择适合的 RAID 方案
 - 网卡:保证足够的吞吐量,建议千兆网卡
 
MySQL 优化:软件
- OS 类型
- Linux
 - FreeBSD
 
 - Linux 关键配置
- 文件打开描述符:/etc/security/limits.conf 中 nofile、/proc/sys/fs/nr_open
 - 可分配文件句柄数:/etc/sysctl.conf 中 fs.file-max、/proc/sys/fs/file-max
 - 进程数:/etc/security/limits.conf 中的 nproc
 - 线程数:/proc/sys/kernel/thread-max
 - 其他 TCP 和网络相关选项:/etc/sysctl.conf
 - 这些都可以通过ulimit 或 直接调整 /proc 中变量进行临时修改
 - 建议关闭 SWAP 分区(内存要足够大才行);如果数据太大,为了防止夯死主机,可以设置 2G 左右的 SWAP 分区
 
 
MySQL 优化:基础配置
基础配置 & MyISAM 配置
1  | max_connections=3000  | 
InnoDB 配置
1  | innodb_file_per_table=1  | 
MySQL 优化:表设计原则
- 互联网业务的特点:数据量大、读写操作多、业务模式相对简单
 - 单表字段不宜过多,尽量不按照第三范式去设计表结构,
 - 尽量减少表关联,适当的冗余保证不联表查询
 - 表名和字段尽量采用小写字母+下划线的命名规则,尽量使用英文,例如:user_score
 - 每个表一定要有主键,一般建议自增ID;单表索引不宜过多,一般5~6个索引
 - 字段尽量使用高效类型,比如数字或时间,IP地址、手机号等都可以使用数字类型存储,非不得已采用字符
 
MySQL 优化:查询语句
- 不要写太复杂的SQL语句,尽量简单,能够让业务去做的,就不要让数据库区操作
 - 尽量避免:子查询、group by、distinct 等操作(子查询可以用left join替代)
 - where、order by 等关键字段一定要建立索引,where里多个条件经常使用的可以建立联合索引(注意建立索引的数据必须是尽量分布多并且具备单调性,重复率低)
 - 把数据当做神一样来供着,能够缓存的尽量缓存(redis、memcached等),能够多次查询的就不要关联查询
 - 所有的变更操作(update、delete)必须有where条件!
 - 不适合使用MySQL服务的数据功能操作,尽量采用别的第三方服务支持,比如全文检索功能
 
MySQL 优化:SQL 优化实例
- Like 优化
 - Limit 优化
 - InnoDB 中 count 优化
 - 定期使用 Explain 查看执行计划
 
PHP 与 MySQL 交互
- 
扩展层
 - 
代码层
- 为防止mysql太慢夯住PHP,建议设置SQL超时,或者设置execute_time等超时设置
 - $mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
 - $mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
 - 务必在代码里记录相关SQL语句执行性能和时间等信息,方便后续优化
 
 - 
超时设置
- PHP代码连接后端的超时设置
 - php.ini中execute_time设置
 - php-fpm中request_terminate_timeout,request_slowlog_timeout
 - nginx upstream相关超时设置
 
 
PHP 与 MySQL 安全
- SQL 注入
 - MySQL 服务端
 - 备份机制
 
