公司用的 MySQL 团队开发规范,太详细了,建议收藏( 三 )


14、无特殊需求,严禁使用分区表
 
字段设计规范1、INT:如无特殊需要,存放整型数字使用UNSIGNED INT型,整型字段后的数字代表显示长度 。比如 idint(11) NOT
2、DATETIME:所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型 。
对于TIMESTAMP,它把写入的时间从当前时区转化为UTC(世界标准时间)进行存储 。查询时,将其又转化为客户端当前时区进行返回 。而对于DATETIME,不做任何改变,基本上是原样输入和输出 。
另外DATETIME存储的范围也比较大:
timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 。
datetime所能存储的时间范围为:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999' 。
但是特殊情况,对于跨时区的业务,TIMESTAMP更为合适 。
3、VARCHAR:所有动态长度字符串 全部使用VARCHAR类型,类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替;VARCHAR(N),
N表示的是字符数而不是字节数 。比如VARCHAR(255),可以最大可存储255个字符(字符包括英文字母,汉字,特殊字符等) 。但N应尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,且存储字符个数由所选字符集决定 。
如UTF8存储一个字符最大要3个字节,那么varchar在存放占用3个字节长度的字符时不应超过21845个字符 。同时,在进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存 。(如无特殊需要,原则上单个varchar型字段不允许超过255个字符)
4、TEXT:仅仅当字符数量可能超过20000个的时候,才可以使用TEXT类型来存放字符类数据,因为所有MySQL数据库都会使用UTF8字符集 。
所有使用TEXT类型的字段必须和原表进行分拆,与原表主键单独组成另外一个表进行存放,与大文本字段的隔离,目的是 。如无特殊需要,不使用MEDIUMTEXT、TEXT、LONGTEXT类型
5、对于精确浮点型数据存储,需要使用DECIMAL,严禁使用FLOAT和DOUBLE 。
6、如无特殊需要,尽量不使用BLOB类型
7、如无特殊需要,字段建议使用NOT 属性,可用默认值代替
8、自增字段类型必须是整型且必须为UNSIGNED,推荐类型为INT或BIGINT,并且自增字段必须是主键或者主键的一部分 。
 
索引设计规范1、索引区分度
索引必须创建在索引选择性(区分度)较高的列上,选择性的计算方式为: selecttivity = count(distinct c_name)/count(*) ; 如果区分度结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行
2、遵循最左前缀
对于确定需要组成组合索引的多个字段,设计时建议将选择性高的字段靠前放 。使用时,组合索引的首字段,必须在where条件中,且需要按照最左前缀规则去匹配 。
3、禁止使用外键,可以在程序级别来约束完整性
4、Text类型字段如果需要创建索引,必须使用前缀索引
5、单张表的索引数量理论上应控制在5个以内 。经常有大批量插入、更新操作表,应尽量少建索引,索引建立的原则理论上是多读少写的场景 。
6、ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引
7、正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别 。
8、正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引 。
9、联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配 。
如:depno=1 and empname>'' and job=1 如果建立(depno,empname,job)顺序的索引,job是用不到索引的 。
10、应需而取策略,查询记录的时候,不要一上来就使用*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率 。
11、正确判断是否使用联合索引(上面联合索引的使用那一小节有说明判断规则),也可以进一步分析到索引下推(IPC),减少回表操作,提升效率 。
12、避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效 。这是实际上就是需要保证索引所对应字段的”干净度“ 。


推荐阅读