首页 > 代码库 > MySQL开发规范
MySQL开发规范
字符设计规范:
1. 选择合适的字符集,短字符集更利于传输和存储:通常使用UTF8字符集。如果确认系统只需要支持英文字符,则用latin1;如果只需要支持中文,则用GBK,GB2312;需要国际化,则用UTF8
2. character-set-server服务端(db,table,filed)--- default_character_set客户端(connection)--工具(GUI)。确保这三种字符集一致,才可以避免乱码的问题
3. 校验字符集: collation-server=*_ci,*_bin
4. 字符集和校验规则的指定:就近原则 ( 级别高低 server > database > table > column )
5. MySQL数据库脚本文件字符集,要与数据库保持一致。( Latin1—ISO-8859-1;GBK,GB2312—UTF8;UTF8—UTF8),确保mysql执行这些脚本的时候,不会乱码
mysql 索引规范:
1. 索引的顺序
向右匹配直到遇到范围查询就停止匹配
等值(=) -> 范围( < , > , between , like ) -> join -> 排序 ( order by , group by , distinct )
2. 尽量使用复合索引覆盖单列索引
3. 避免重复索引
同一个表有 (a)单列索引, (a,b)组合索引 和 (a,b,c)组合索引
4. 不要在索引列使用函数: max(id) , mysql不支持函数索引
5. 尽量使用选择率高的字段作为前缀索引
count(distinct column)/count(*) ,越高越好
6. 索引中字段数不超过5个
7. 唯一索引和主键重复
8. order by , group by , distinct字段需要在索引后面添加
9. SQL上线前查看explain检查执行计划是否合理,避免extra列出现 using filesort , using temporay
10. varchar字段建立索引时,不超过15个字符长度前缀索引
下面的表增加一列url_crc32,然后对 url_crc32 建立索引,减少索引字段的长度,提高效率,前面的url字段最好是唯一字符,提高选择率
CREATE TABLE all_url(
ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255) NOT NULL DEFAULT 0,
url_crc32 BIGINT UNSIGNED NOT NULL DEFAULT 0,
index i_url_crc32(url_crc32)
)engine = InnoDB;
合理创建联合索引(避免冗余),(a,b,c) 索引已经可以覆盖 (a) 、(a,b) ,就没必要创建后两个索引了
合理利用覆盖索引,也就是尽可能在SELECT 中包含索引中的字段,减少回表读取产生的I/O 读
11. 类型隐式转换导致执行计划改变
mysql ddl规范:
1. 所有变更至少提前1天提交
2. 所有dll需求要Team Leader审核通过之后提交
3. 所有新上线的表都必须确定索引后才能上线
mysql sql语句开发:
1. 少用触发器
2. 不使用 * , select 使用具体的字段名
3. 减少锁等待和竞争,避免使用大事务,使用短小事务
4. 禁止使用% 前缀模糊查询 where like ‘%xxx‘
5. 某些低版本mysql 尽量使用join 代替子查询
6. 使用延迟关联解决大offset分页问题
7. 禁止并发执行 count(*)
8. 禁止使用order by rand()
9. 批量更新和删除 , 不要一次更新大量数据
10. sql使用in 代替 or (or效率高于in)
命名规范:
1. 数据库名,表名和字段名不要超过32个字符
2. 禁用特殊符号
3. 不得与rdbms保留字冲突
4. 库/表/字段/索引名称一律小写
表设计规范:
1. 只使用innodb存储引擎 , 支持事务 , myisam引擎不支持事务和只有表级别锁
2. auto_increment 必须有并且自增主键跟业务是透明的,因为透明主键对业务操作不会有任何影响,主从同步也优先根据主键进行
3. 禁止联合字段和字符字段做主键 , 主键字段过长导致性能问题 , 联合字段容易导致死锁问题
4. 不在数据库中存储图片,文件等大数据
5. 禁止使用分区表
6. 避免使用数据库保留字段
列设计规范:
1. 尽量减少存储空间
2. 尽量使用数值类型 + unsigned
3. 少用blog/text字段 , 如有需要 , 将该表分为主表和子表用主键一一对应 , 子表只存放blog/text字段和对应主表的主键
4. 禁止使用外健 , 对于数据库的所有外键的每次插入、更新和删除后,进行完整性检查是一个耗费时间和资源的过程,它可能影响性能,特别是当处理复杂的或者是缠绕的连接树时。
5. 使用unsigned存储非负整数
6. varchar(N) 是表示字符数
7. 用tinyint来替换枚举类型enum和集合类型set
8. 时间使用datetime 或者使用时间戳
语句实现的锁
1. select ... from , 一致性非锁定读
2. lock in shared mode , 共享
3. select ... for update , 排他
4. update / delete, 排他
5. insert ... on duplicate key update , 排他
6. replace , 没冲突/重复时,和insert 一样
7. insert into t select ... from s , t表加排他
8. create table t ... select , t表加排他
9. replace into t select ... from s where 或者 update t ... where col in (select ... from s),都会在s表上排他
MySQL开发规范