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
相关文章推荐
- 常用的mysql语句
- 使用Hibernate框架链接访问MySql数…
- mysql排序后自动生变编号
- 向MySql数据库中导入Excel表格中的…
- 使用SQLyog导出导入MySql中的数据…
- MySQL之查询性能优化二
- 磁盘空间满引起的mysql启动失败:ERROR! MySQL server PID file could not be found!
- xampps mysql修改密码
- MySQL binlog的格式解析
- mysql profiles 性能查询
- mysql进阶(十二)常见错误汇总
- mysql进阶(十二)常见错误汇总
- mysql 批量删除数据
- mysql怎么清掉自增长的id
- C#连接mysql数据库的方式
- JDBC 连接数据库实例(MySQL为例)
- Can't connect to MySQL server on 'XXX' (13)
- mysql 性能分析及explain用法
- mysql的常用查询辅助函数汇总
- mysql 外键(foreign key)的详解和实例