您的位置:首页 > 数据库 > MySQL

MySQL规范

2015-07-31 16:36 267 查看

MySQL规范整理

1. 命名规范

① 库名、表名、字段名必须使用小写字母,并采用下划线分割

如库名/表名/字段名: sys_user

② 库名、表名、字段名禁止超过32个字符。须见名之意

③ 库名、表名、字段名禁止使用MySQL保留字

④ 临时库、表名必须以temp为前缀,并以日期为后缀

[code]如:temp_tablleName_20150721


⑤ 备份库、表名必须以bak为前缀,并以日期为后缀

如:bak_tableName_20150721

2. 基础规范

① 使用INNODB存储引擎

② 表字符集使用UTF8

③ 所有表都需要添加注释

④ 单表数据量建议控制在5000W以内

⑤ 不在数据库中存储图片、文件等大数据

⑥ 禁止在线上做数据压力测试

⑦ 禁止从测试、开发环境直连数据库

⑧ 单表超过5000W可以考虑分表,采用模运算方法分表等合适的分表策略

3. 库表设计

① 禁止使用分区表

② 拆分大字段和访问频率低的字段,分离冷热数据

③ 用HASH进行散表,表名后缀使用十进制数,下表从0开始

④ 按日期时间分表需要符合YYYY[MM][DD][HH]格式

⑤ 采用合适的分库表策略。例如千库十表、十库百表等

4. 字段设计

① 尽可能不使用TEXT、BLOB类型

② 用DECIMAL代替FLOAT和DOUBLE存储精确浮点数

③ Simple is good

将字符转化为数字

使用TINYINT来代替ENUM类型

④ Generosity can be unwise(不希望这样做浪费空间,也不给少)

存储‘hello’时VARCHAR(5) vs VARCHAR(200)

⑤ Avoid null if possible

所有字段均定义为 not null

⑥ Smaller is usually better

使用UNSIGNED存储非负整数(必须>0)

INT数据类型固定占用4字节存储

使用INT UNSIGNED存储IPV4

使用VARCHARY存储大小写敏感的变长字符串

禁止在数据库中存储明文密码

5. 索引规范

1)索引的用途

去重

加速定位

避免排序

覆盖所有

2)索引数控量控制

单张表中索引数量不超过5个

单个索引中的字段数不超过5个

对字符串使用前缀索引,前缀索引长度不超过8个字符

建议优先考虑前缀索引,必要是可以添加伪列并建立索引

3)主键准则

表必须有主键

不使用更新频繁的列

尽量不选择字符串列

不使用UUID MD5 HASH

默认使用非空的唯一键

建议选择自增后发号器

4)重要的SQL必须被索引

UPDATE 、DELETE语句的WHERE条件列

ORDER BY 、 GROUP BY 、DISTINCT字段

多表JOIN字段

5) 区分度最大的字段放在前面

6) 核心SQL优先考虑覆盖索引

7) 避免冗余和重复索引

8) 索引不是越多越好

综合评估数据密度和分布

考虑查询和更新比例

9)索引禁忌

不在低基数列上建立索引,例如“性别”

不在索引列进行数学运算和函数运算

10)尽量不使用外键

外键用来保护参照完整性,可在业务端实现

对父表和子表的操作会相互影响,降低可用性

INNODB本身对online DDL的限制

11) 不使用%前到的查询,例如like “%ab”

12)不使用负向查询,如not in/like

无法使用索引,导致全表扫描

全表扫描导致buffer pool利用率降低

6. SQL设计

1)使用预编译语句

只传参数,比传递SQL语句更高效

一次解析,多次使用

降低SQL注入概率

2)避免隐式转换

会导致索引失效

3) 充分利用前缀索引

必须是最左前缀

不可能同时用到两个范围条件

4)避免使用存储过程、触发器、UDF、events等

让数据库做最擅长的事

降低业务耦合度,为sacle out 、sharding 留有余地

避开BUG

5)避免使用大表的JOIN

MySQL最擅长的是单表的主键/二级索引

JOIN消耗较多的内存,产生临时表

6)避免在数据库中进行数学运算

MySQL不擅长数学运算和逻辑判断

无法使用索引

7)减少与数据库的交互次数

INSERT … ON DUPLICATE KEY UPDATE

REPLACE INTO 、INSERT IGNORE、INSERT INTO VALUES(),(),()

UPDATE … WHERE ID IN(10,20,50,….)

8)合理的使用分页

限制分页展示的页数

只能点击上一页、下一页

采用延迟关联

9)拒绝大SQL,拆分成小SQL

充分利用QUERY CACHE (查询缓存)

充分利用多核CPU

10)使用in代替or , in 的值不超过1000个

11)禁止使用order by rand()

12)使用EXPLAN 诊断,避免生成临时表

13)使用union all 而不是union (避免隐形去重)

14)程序应该有捕获SQL异常的处理机制

15)禁止单条SQL语句同时更新多个表(例如触发器)

16)不使用select

消耗CPU和IO 、消耗网络带宽

无法使用覆盖索引

减少表结构变更带来的影响

因为大,select/join 可能生成临时表

数据库是有状态的服务,调整代码部署更灵活、简单、⾼效!而不是改数据库

7. 行为规范

批量导入、导出数据必须要提前通知DBA协议观察

禁止在线上从库执行后台管理和统计类查询

禁止有super权限的应用帐号存在

产品出现非数据库导致的故障时及时通知DBA协助排查

推广活动或上线新功能必须提前通知DBA进行流量评估

数据库数据丢失,及时联系DBA进行恢复

对单表的多次alter 操作必须合并为一次操作

不在MySQL数据库中存放业务逻辑

重大项目的数据库方案选型和设计必须提前通知DBA参与

对特别重要的库表,提前与DBA沟通确定维护和备份优先级

不在业务高峰期批量更新、查询数据库

提交线上建表改表需求,必须详细注明所有相关的SQL语句

8. FAQ

什么时候用CHAR , 什么时候用VARCHAR?

为什么DELETE 、UPDATE 语句的WHERE条件列要加索引?

为什么INNODB表执行count(*)没有MyISAM快?

参考资料:数据库系统概念

MySQL规范整理
命名规范

基础规范

库表设计

字段设计

索引规范

SQL设计

行为规范

FAQ
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: