Mysql性能优化-道
Mysql是目前市面上最成熟,相对稳定,应用最广,基础数据结构映射最完善的免费数据库, mysql 性能优化是一个老生常谈的问题,从程序员入门,到进阶,面试,工作都会与之打交道,这个命题有些大,从头开始讲起有些无从下手,可以从道法术器的不同维度分化解决这个问题;
数据库三要素 (引自数据库系统概论第6版(王珊))
- 数据结构;
- 数据操作;
- 数据完整性约束;
第一性原理
Mysql 是数据库数据存储的具体软件和存储工具,所有操作和目的就是为了将数据存储到磁盘,保存数据,方便程序读取和使用,数据库是软件生命周期的一个重要组成部分,所以数据库也具有软件工程的一些属性和状态, 演化原则,持续升级,并且在软件工程的不同阶段根据不同阶段的特性设计表结构和数据存储方案和方法,软件工程要遵循演化原则,不可能一步到位;
设计基础和规范
-
表明,数据库字段名,表注释,字段注释,数据唯一性约束,数据基础查询索引,命名规范,字段命名规范,注意命名时要见名知意,不要在不必要的语法和标准上纠结,推荐的命名规则,为单数明明category(推荐) categories(不推荐),并且好的表字段命名,可以帮助理解业务逻辑,并且精确定义业务关系,理解使用场景,好的命名规则则程序已经成功了一半;
-
所有表推荐使用Innodb存储引擎;
-
字符集,推荐 utf8-mb4;
-
根据业务场景使用合适的字段类型做数据存储,禁止使用string存储字符串时间;
-
数据库上线时建议给基础表字段添加索引后再上线;
-
禁止给decimal、float,double类型添加索引;
-
索引添加时需要注意索引选择性(Selectivity);
选择度 = COUNT(DISTINCT column) / COUNT(*) >0.3 建议 0.1-0.3 推荐 <=0.1 不推荐 -
谨慎使用 text 数据类型;
-
禁止在数据库存储 base64 格式的图片;
-
严格控制表条目的磁盘空间和表字段宽度,原则上禁止 30 个字段以上的大型表;
-
同一个数据库database 必须使用统一的字符集编码;
-
禁止使用 mysql 全文索引;
-
禁止在线上正式环境使用 like 查询;
-
禁止在线上正式环境,使用没有 limit 的查询即使表数据较少;
-
每一个mysql表必须设置自增主键;
-
mysql表主键只能自增不允许写入自定义主键值;
-
禁止在线上环境对生产表实时表结构,索引修改;
-
禁止手动修改线上环境数据,增删改等;
-
禁止开发人员使用包含写权限的线上环境直连账号;
-
任何情况下禁止使用循环+count的查询方式;
-
禁止在生产环境,数据库服务状态下对分布式数据库增配;
-
禁止使用大事务
-
禁止使用 offset limit 进行大深度的分页查询
-
禁止使用大批量的数据 in 查询
-
禁止具体业务逻辑使用 mysql存储过程,触发器
-
禁止在主从场景下,使用sleep在从库查询主库数据
-
禁止使用悲观锁的方式实现原子自增修改
-
禁止在生产环境,对表进行一条 sql超过100w条以上的数据删除或修改;
vudgneiwrtrifjgyflwfufszoyxysw