MYSQL DB规范
来源:互联网 发布:脑洞网络用语 编辑:程序博客网 时间:2024/06/07 23:08
命名规范
库名、表名、字段名必须使小写字符,并采用下划线分割
库名、表名、字段名禁止超过32个字符。须见名知意
库名、表名、字段名禁止使用MySQL保留字
临时库、表名必须以tmp为前缀,并以日期为后缀
备份库、表必须以bak为前缀,并以日期为后缀
例子:
create table TTT (insert
int(10) not null …)
create table abc_1202 …
alter table t add index idx_uid_mid_time(uid,mid,time)
alter table t add index idx_uid(uid,mid,time) ->NO
tmp_test01_0704 ->NO bak_test01_20130704基础规范
使用INNODB存储引擎
表字符集使?UTF8
所有表都需要添加注释
单表数据量建议控制在5000W以内 ->500W内性能最佳
不在数据库中存储图片、文件件等大数据
禁止在线上做数据库压力测试
禁止从测试、开发环境直连数据库库表设计
慎用分区表
拆分大字段和访问频率低的字段,分离冷热数据
用HASH进行散表,表名后缀使十进制数,下标从0开始
按日期时间分表需符合YYYY[MM][DD][HH]格式
采用合适的分库分表策略。例如千库十表、十库百表等 、
例子:
comment_20120815
comment_20120816
comment_120817
user_39
user_3A
user_3B
user_3C字段设计
尽可能不使用TEXT、BLOB类型
用DECIMAL代替FLOAT和DOUBLE存储精确浮点数
Simple is good
将字符转化为数字
使用TINYINT来代替ENUM类型
Generosity can be unwise
存储 “hello”时VARCHAR(5) VS VARCHAR(200)
The best strategy is to allocate only as much space as you really need.
ENUM(‘Mercury’, ‘Venus’, ‘Earth’) numbers ENUM(‘0’,’1’,’2’)
存储index,而不是字符串
枚举值改变会导致DDL
Avoid null if possible
可为NULL的列影响索引统计数据生成
可为NULL的列加索引会占用额外空间
所有字段均定义为NOT NULL
Smaller is usually better
使用UNSIGNED存储非负整数
INT类型固定占用4字节存储
使用timestamp存储时间
使用INT UNSIGNED存储IPV4
使用VARBINARY存储大小写敏感的变长字符串
禁止在数据库中存储明文密码索引规范
索引的用途
去重
加速定位
避免排序
覆盖索引
索引数量控制
单张表中索引数量不超过5个
单个索引中的字段数不超过5个
对字符串使用前缀索引,前缀索引长度不超过8个字符
建议优先考虑前缀索引,必要时可添加伪列并建立索引
主键准则
表必须有主键
不使用更新频繁的列
尽量不选择字符串列
不使用UUID MD5 HASH
默认使非空的唯一键
建议选择自增或发号器
重要的SQL必须被索引
区分度最大的字段放在前面
核心SQL优先考虑覆盖索引
避免冗余和重复索引
索引不是越多越好
综合评估数据密度和分布
考虑查询和更新比例
索引是一把双刃剑:降低插入和更新速度,占用磁盘空间
索引禁忌
不在低基数列上建立索引,例如“性别”
不在索引列进行数学运算和函数运算
尽量不使用外键
外键用来保护参照完整性,可在业务端实现
对父表和子表的操作会相互影响,降低可用性
INNODB本身对online DDL的限制
不使用%前导的查询,如like “%ab”
不使用负向查询,如not in/like
无法使用索引,导致全表扫描
全表扫描导致bufer pool利用率降低
尺有所短,寸有所长,换一种工具试试!SQL设计
避免使用存储过程、触发器、UDF、events等
让数据库做最擅长的事
降低业务耦合度,为scale out、sharding留有余地
避开BUG
避免使用大表的JOIN
MySQL最擅长的是单表的主键/二级索引查询
JOIN消耗较多内存,产生临时表
避免在数据库中进行数学运算
MySQL不擅长数学运算和逻辑判断
无法使用索引
md5()/order by rand()
select … where to_days(current_date) - to_days(date_col)<=10
select … where date_col>=date_sub(current_date, interval 10 day)
select … where date_col>=date_sub(‘2013-08-17’, interval 10 day)
select … where date_col>=‘2013-08-07’
数据库是有状态的服务,调整代码部署更灵活、简单、高效!
减少与数据库的交互次数
INSERT … ON DUPLICATE KEY UPDATE
REPLACE INTO、INSERT IGNORE 、INSERT INTO VALUES(),(),()
UPDATE … WHERE ID IN(10,20,50,…)
合理的使用分页
限制分页展开的页数
只能点击上一页、下一页
采用延迟关联(join的延迟)
拒绝大SQL,拆分成小SQL
充分利用QUERY CACHE
充分利用多核CPU
使用in代替or,in的值不超过1000个 (所在列没有索引的情况差别巨大)
禁止使用order by rand()
使用EXPLAIN诊断,避免生成临时表
用union all而不是union(union会多做一次去重的操作)
程序应有捕获SQL异常的处理机制
禁止单条SQL语句同时更新多个表
不使用select *
消耗CPU和IO、消耗网络带宽
无法使用覆盖索引
减少表结构变更带来的影响
因为大,select/join 可能生成临时表
select * from opp where phone=‘12345678’ or phone=‘234234234’
select * from opp where phone in (’12345678’, ‘234234234’)
select * from app where phone=‘010-88886666’ or cellphone=‘18618111111’
select * from opp where phone=’010-88886666’
union all select * from opp where cellphone=’ 18618111111’行为规范
批量导入、导出数据必须提前通知DBA协助观察
禁止在线上从库执行后台管理和统计类查询
禁止有super权限的应用程序账号存在
产品出现非数据库导致的故障时及时通知DBA协助排查
推广活动或上线新功能必须提前通知DBA进行流量评估
数据库数据丢失,及时联系DBA进行恢复
对单表的多次alter操作必须合并为一次操作
不在MySQL数据库中存放业务逻辑
重要项目的数据库方案选型和设计必须提前通知DBA参与
对特别重要的库表,提前与DBA沟通确定维护和备份优先级
不在业务高峰期批量更新、查询数据库
提交线上建表改表需求,必须详细注明所有相关SQL语句
良好的线上环境需要大家共同的努力!
- MYSQL DB规范
- 数据库命名规范--通用(sql,mysql,orcle,db)
- 58DB规范
- Python DB-API 2.0规范
- mysql DB(学习笔记)
- mysql DB 远程访问
- C++ Wrapped Mysql DB
- db mysql error_list
- 一个DB类,MYSQL
- MySQL binlog-ignore-db
- [DB] Mysql learning notes!
- mysql DB C#封装
- MYSQL DB SYN
- DB-MySQL简介
- 2.DB-Mysql++实例
- 【DB】mysql 字段类型
- 【DB】mysql操作符
- DB理论--mysql基础
- ConcurrentLinkedQueue & CopyOnWriteArrayList
- (二)spring cloud微服务分布式云架构
- CyclicBarrier实现原理
- ReentrantLock实现原理
- spring-data-cassanra的简单使用
- MYSQL DB规范
- NOIP 2015 子串 (DP)
- Kafka集群配置
- 维护集合Ⅰ【无旋Treap数组模板】
- 权限修饰符
- Kafka知识点
- 方法调用认识①
- C++ dijkstra 最短路径算法、top排序、DFS、BFS 示例 C++11
- Redis知识点