MySQL 规范手册【转载】

原文:58同城沈剑的MySQL军规
一、基础规范
第一条:表存储引擎必须使用InnoDB
解读:支持事务、行级锁

第二条:使用utf8(utf8mb4)字符集
解读:
(1)通用,无乱码风险,汉字3字节,英文1字节
(2)utf8mb4是utf8的超集,存储4字节(支持表情符号) 推荐

第三条:表、字段必须加入中文注释
解读:对于表和字段创建的时候加入comment '中文注释'

第四条:禁止使用存储过程、视图、触发器、Event
解读:高并发大数据的互联网业务,架构设计思路是“ 解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“ 增加业务应用层的机器来增加性能”。(数据库擅长存储与索引,CPU计算还是留给业务应用层)

第五条:禁止在数据库中存储大文件
解读:照片,可以将大文件存储在对象存储系统,数据库中存储路径

二、命名规范
第一条:只允许使用内网域名,而不是ip连接数据库
解读:虽然IP访问更快,域名访问需要内网DNS,但是对于大数据库的扩展和迁库考虑,域名更好

第二条:库名、表名、列名必须用小写,采用下划线分隔
解读:abc、Abc、ABC都是给自己埋坑

第三条:库名、表名、列名必须见名知义,长度不要超过32字符,禁止拼音英文混用
解读:见名知意,方便后续维护

第四条:表名t_xxx,非唯一索引idx_xxx,唯一索引uniq_xxx
解读:见名知意,方便后续维护

第五条:库备份必须以bak为前缀,以日期为后缀

第六条:从库必须以-s为后缀

第七条:备库必须以-ss为后缀

三、表和字段设计规范
第一条:禁止使用外键,如果要保证完整性,应由应用程式实现
解读:外键使得表之间相互耦合,影响update、delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈。

第二条:必须把字段定义为NOT NULL并设默认值
解读
(1)NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化
(2)NULL需要更多的存储空间
(3)NULL只能采用IS NULL 或者 IS NOT NULL,而在=/!=/in/not in时有大坑,比如:执行where name != 'tim',如果存在name为null值得记录,查询结果就不会包含name为null的记录值。

第三条:禁止使用TEXT、BLOB类型(建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据)

第四条:禁止使用小数存储国币
解读:使用 “分”作为单位,这样数据库里就是整数

第五条:使用varchar(20)存储手机号,不要使用整数
解读:
(1)牵扯到国家代号,可能出现+/-/()等字符,例如+86
(2)手机号不会用来做数学运算
(3)varchar可以模糊查询,例如:like '138%'

第六条:使用TINYINT来代替ENUM
解读:ENUM增加新值要进行DDL操作

第七条:表必须有主键,推荐使用UNSIGNED整数为主键
解读:
(1)主键递增,数据行写入可以提高插入性能,可以避免page分裂,减少表碎片提升空间和内存的使用;
(2)主键要选择较短的数据类型,Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效减少索引的磁盘空间,提高索引的缓存效率;
(3)无主键的表删除,在row模式的主从架构,会导致备库挂住

第八条:使用INT UNSIGNED 存储IPv4,不要用char(15)

第九条:根据业务区分使用tinyint/int/bigint,分别会占用1/4/8字节

第十条:根据业务区分使用char/varchar
解读:
(1)字段长度固定,或者长度近似的业务场景,使用使用char,能够减少碎片,查询性能高
(2)字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间

第十一条:单实例表个数必须控制在2000个以内

第十二条:单表分表个数必须控制在1024个以内

第十三条:根据业务区分使用datetime/timestamp
解读:前者占用5个字节,后者占用4个字节(2038年),推荐使用DateTime。

四、索引设计规范
第一条:单张表索引数量建议控制在5个以内
解读:
(1)互联网高并发业务,太多索引会影响写性能
(2)生成执行计划时,如果索引太多,会降低性能,并可能导致MySQL选择不到最优索引
(3)异常复杂的查询需求,可以选择ES等更为适合的方式存储

第二条:组合索引字段数不建议超过5个
解读:如果5个字段不能极大缩小row范围,八成是设计有问题

第三条:禁止在更新十分频繁、区分度不高的属性上建立索引
解读:
(1)更新会变更B+树,更新频繁的字段建立索引回大大降低数据库性能;
(2) “性别”这种区分不大的属性,建立索引没有什么意义,不能有效过滤数据,性能与全表扫描类似

第四条:建立组合索引,必须把区分度高的字段放在前面
解读:能够更加有效的过滤数据

五、SQL使用规范
第一条:禁止使用select *,只获取必要字段,需要显示说明列属性
解读:
(1)读取不需要的列会增加CPU、IO、NET消耗
(2)不能有效的利用覆盖索引
(3)使用SELECT * 容易在增加或者删除字段后出现程序BUG

第二条:insert必须指定字段,禁止使用insert into T values()
解读:指定字段插入,在表结构变更时,能保证对应用程序无影响

第三条:禁止使用属性隐式转换
解读:SELECT uid FROM t_user WHERE phnoe=13890392334 会导致全表扫描,而不能命中phone索引。int数据类型优先级高于varchar,改查询会把phone转换为int,因此需要把表中的phone数据转换成int,而全表扫描phone是varchar类型,SQL语句带入的是整形,故不会命中索引。
解决方法:SELECT uid FROM t_user WHERE phone='13890392334'(加个引号就好)

第四条:禁止在where条件列使用函数或者表达式
解读:SELECT uid FROM t_user WHERE from_unixtime(day)>'2017-02-15'导致全表扫描
解决方法:SELECT uid FROM t_user WHERE day>=unix_timestamp('2017-02-15 00:00:00')
导致不能命中索引,全表扫描

第五条:禁止大表使用JOIN查询,禁止大表使用子查询
解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能(大表指的是数据量在1000万以上)

第六条:禁止使用OR条件,必须改为IN查询
解读:旧版本的MySQL的OR查询不能命中索引的。而IN能够有效使用索引。

第七条:理解组合索引最左前缀原则,避免重复建索引,如果建立了(a,b,c),相当于建立了(a),(a,b),(a,b,c)

第八条:禁止使用负向查询,以及%开头的模糊查询
解读:
(1)什么是 负向查询:比如:NOT、!=、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描;
(2)%开头的模糊查询,会导致全表扫描。
一般来说,WHERE过滤条件不会只带这么一个“负向查询条件”,还会有其他过滤条件
举个栗子:
查询tim已完成订单之外的订单:
SELECT oid FROM t_order WHERE uid=123 AND status !=1;订单表5000W数据,但uid=123就会迅速的将数量过滤到很少的级别(uid建立了索引),此时再接上一个负向的查询条件就无所谓,扫描的行数就会很少。但如果要查询所有已完成订单之外的订单:SELECT odi FROM t_order WHERE status != 1;这就挂了,立马CPU100%,status索引会失效,负向查询导致全表扫描。

第九条:应用程序必须捕获SQL异常,并且有相应处理
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL DBA手册是一本详细阐述了MySQL数据库管理员必须掌握的知识和技能的参考书。MySQL是一种开源数据库管理系统,广泛应用于各个领域的数据管理,因此MySQL DBA手册对于MySQL数据库管理员来说是非常重要的。 MySQL DBA手册包括了MySQL数据库的设计、安装、配置、优化、备份与恢复、监控与维护等方面的内容。这些知识点都是MySQL数据库管理员必须掌握的基础知识,通过深入理解这些内容,数据库管理员可以更好地管理MySQL数据库,保障其稳定可靠地运行。 MySQL DBA手册也包括一些高级主题,包括复制、分区、集群、安全管理等。这些主题都是MySQL数据库管理员需要面对的挑战,通过深入学习这些主题,数据库管理员可以更好地应对这些挑战。 总之,MySQL DBA手册具有指导MySQL数据库管理员管理和维护MySQL数据库的实用性和实效性,相信它对于MySQL数据库管理员学习和实践都具有重要的意义和价值。 ### 回答2: MySQL DBA手册是为数据库管理员(DBA)提供的,旨在帮助他们管理MySQL数据库实例,确保数据库的可靠性、安全性和性能。MySQL是一种开源的关系型数据库管理系统,是许多企业和互联网公司使用的主流数据库之一。 MySQL DBA手册涵盖了许多方面,包括安装、配置、备份和恢复、性能优化、安全性、监控和故障排除等。以下是一些重要的主题: 1. 安装和配置:MySQL DBA手册介绍了如何安装和配置MySQL实例,包括选择适当的选项、设置MySQL服务器参数、创建用户帐户等。 2. 备份和恢复:MySQL DBA手册介绍了如何备份和恢复MySQL数据库,包括使用mysqldump备份和使用二进制日志进行增量备份。 3. 性能优化:MySQL DBA手册提供了许多技巧和方法,帮助DBA优化数据库性能,如使用索引、调整缓存大小、使用分区等。 4. 安全性:MySQL DBA手册指导DBA如何确保数据库的安全性,包括访问控制、密码管理、SSL证书和安全审计等。 5. 监控和故障排除:MySQL DBA手册提供了许多监控和故障排除的技术,帮助DBA识别和解决问题,如使用慢查询日志、跟踪线程、使用崩溃日志进行故障排除等。 总之,MySQL DBA手册提供了一系列实用工具和技术,帮助DBA管理和维护MySQL数据库实例,确保其可靠性、安全性和性能,使数据库能够为企业或互联网公司提供无缝的支持和服务。 ### 回答3: MySQL DBA手册是一本详尽的MySQL数据库管理手册,它涵盖了MySQL的各个方面,包括安装、配置、备份和恢复、性能优化、安全、高可用性等等。MySQL DBA手册是一个非常有用的资源,可供MySQL管理员和运维人员使用,以确保MySQL数据库的最佳性能并确保数据的安全和完整性。 MySQL DBA手册的内容非常丰富,其中包括如何选择合适的硬件和操作系统,如何创建和配置MySQL数据库,如何备份和恢复数据,如何监视和优化MySQL性能,如何实现高可用性,如何维护安全性等等。此外,MySQL DBA手册还提供了许多与MySQL相关的技术和工具的详细说明和例子。 MySQL DBA手册对于MySQL的初学者和有经验的管理员来说都是一个非常重要的资源。初学者可以通过手册学习如何创建和配置MySQL数据库,以及如何进行数据备份和恢复。有经验的管理员可以使用MySQL DBA手册学习更高级的技术,例如如何优化MySQL性能或实现高可用性。 总之,MySQL DBA手册是一个非常有用的资源,它为MySQL管理员和运维人员提供了一个有用的参考,以确保他们能够始终保持MySQL数据库的最佳性能和安全性。 MySQL DBA手册对于MySQL数据库的管理和维护是一个不可或缺的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值