笔记:Mysql踩坑及配置优化

配置优化#

优化配置与具体的服务器硬件配置以及软件业务设计有关,如有疑问请保持默认配置。
mysql.cnf 摘自网络,仅供参考!

[mysqld]
#######设置连接、工作线程相关#########
#连接、进程相关参数,受限于系统内核的单进程最大打开文件数
#最大连接数,此值的设定,需要在具体服务器上大量尝试,并根据其压力测试结果决定
max_connections=3000
#当连接已满时,等待队列的大小
back_log=500
#空闲连接超时时长(秒),当空闲连接超过该时间,会被关闭
wait_timeout=1800
#处理线程缓存数,相当于空闲线程的最大值,能避免线程频繁创建与销毁的花销
thread_cache_size=512
#SQL语句解析后,允许同时使用InnoDB数据引擎的线程数,一般是核心数的2倍
innodb_thread_concurrency=8

#########设置缓存相关##########
#设置缓存可减少磁盘I/O操作,使得读取数据的操作更快
#设置缓冲池的大小,一般是服务器内存的60%-70%。缓冲池是保存索引和原始数据的地方,可减少磁盘I/O;缓冲池是针对InnoDB数据引整(默认引擎)的设置
innodb_buffer_pool_size=10240M
#设置每个表一个独立的数据文件,一定程度上避免文件读写竞争,但数据文件总大小会变大
innodb_file_per_table=1
#mysqld上所有session中prepared语句的上限,加快SQL语句解析速度
max_prepared_stmtcount=100000
#表示在每次事务提交的时候会把log_buffer刷到文件系统中去,但并不会立即刷写到磁盘
#数据库崩溃可能会丢失数据。如果数据需要确保不丢失,把此设置去掉或设置成1
innodb_flush_log_at_trx_commit=2
##########写入优化相关###########
#设置redo日志的大小,最佳为业务峰值1小时的业务日志大小
innodb_log_file_size=1500MB
#决定innodb数据文件及redo log的打开、刷新方式
#此设置会跳过系统的io缓存,从磁盘上读取。此方式不一定性能最好,但能保证数据稳定写入
innodb_flush_method=O_DIRECT

一些常见的坑#

  1. 访问控制(User 和主机);
  2. 禁止业务系统使用 root,root 应作为保留管理员账号;
  3. 字符集建议都设置为 utf8mb4;
  4. 表必须有主键,且设置 id 为自增主键;
  5. 表字段不得超过 30 个,且单表数据最好不要超过 400w,大数据进行合理分表(水平 / 垂直);
  6. 库表字段等要规范且有意义的命名,使用蛇形命名且禁止大写;
  7. 引擎类型一律为 InnoDB,如无特殊需求。禁止使用 InnoDB/MyISAM/Memory 以外的存储引擎;
  8. 表字段禁止 NULL,必须 NOT NULL default 默认值,NULL 值会存在占用额外存储空间、索引失效等其他问题;
  9. 字段最好不要出现 blobtext,实在需要时请使用拓展表;
  10. 索引个数最好不要超过 5 个,唯一索引以 uq_开头,普通索引以 idx_开头;
  11. join 必须使用索引,in 查询不要超过 1000,合理使用 join 与 in (笛卡尔积与子查询不用索引);
  12. 禁止写 select *,同理禁止 insert into t1 values(…);
  13. UNION ALL 替代 UNION;
  14. DML 语句 where 条件必须用索引,注意表锁问题;
  15. 合理使用索引,注意索引左原则、索引失效,null 值等的影响;

其他分享:
为什么 MySQL 使用 B+ 树
MySQL 和 InnoDB

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

不错,都是基础且必须遵所的。有两三条没试过的,再试试。

3年前 评论

text 不能默认 null 应该默认是什么

3年前 评论
巴啦啦臭魔仙 3年前
臭鼬 (作者) 3年前
小李世界 3年前
小李世界 3年前
Diego_crazy (楼主) 3年前

大部分是阿里那个 mysql 标准吧,我现在习惯基本就是这样操作的

3年前 评论

为什么索引个数不要超过 5 个了

3年前 评论

@PHPer 技术栈 没啥为什么,建议不要超过 5 个,个人觉得 5 个已经不少了。索引越多,相应的负担坑定就越大,无论是性能(I/O)还是维护方面。

3年前 评论
PHPer技术栈 3年前
PHPer技术栈 3年前
Diego_crazy (作者) (楼主) 3年前

怎么解释 laravel 软删除 是 is null ?

3年前 评论
raybon 3年前
lufeijun1234 3年前

@zwc4228986 这个不用解释,你愿意去用就应该明确且接受它可能会给你带来的影响。

3年前 评论
aab

ORM 用习惯了 select * 这个感觉无解了

3年前 评论
白小二

@cxlblm select * ,很可能会导致回表操作,其它的倒没啥

3年前 评论

@Diego_crazy 为啥不是 =0 ,而是 is null?

3年前 评论