mysql 使用规范

以下内容来自sina DBA建议

  1. 表字符集选择UTF8(必须,ps:应该和内部环境有关系)
  2. 存储引擎使用innodb(强烈建议)
  3. 使用varbinary存储变长字符串(建议)
  4. 不在数据库中存储图片,文件等(强烈建议)
  5. 单张表的数据量控制在5000w一下(建议,ps:一般来说,我们会在500w以下的级别)

字符类的规范

  1. 所有的字段均定义为not null(ps:出于存储空间的考虑)
  2. 使用unsigned 存储非负整数(必须)
  3. 使用timestamp存储时间(强烈建议)
  4. 使用varchar存储变长字符串(建议)
  5. 使用unsigned int存储ipv4的地址,而不是char(15)(必须)
  6. 使用tinyint来代替enum,set类型
  7. 少用并尽可能的拆分text,blob类型字符串(建议)
  8. 使用decimal存储精确浮点数(必须)
  9. 将字符串转为数字(建议)
  10. 尽可能的节省空间

索引的规范

  1. 单个索引中的字段数不超过5个
  2. 单张表的索引数量不超过5个
  3. 字符串使用前缀索引,前缀长度不超过8个字符
  4. 对特殊字段,增加crc32或者md5的伪列并建立索引
  5. 区分度大的字段放在前面
  6. 核心的sql优先考虑非覆盖索引(建议)
  7. 避免冗余的索引
  8. 能不建立索引,尽量不建立索引(建议,平局数据密度和分布,查询更新的比例)

主键的索引

  1. 不使用更新频繁的列
  2. 尽量不选择字符串列
  3. 不适用uuid md5 hash
  4. 默认使用非空的唯一键
  5. 建议选择自增或者是发号器

索引的禁忌

  1. 不要在低基数列上建立索引,(ps:比如数据重复率15%以上)
  2. 不要再索引上进行数学运算和函数运算(必须)
  3. 尽量不要使用外键
  4. 不使用%前导的查询,例如like “%abc”(必须)
  5. 不在null列上加索引
  6. 不使用select ×(必须,减少cpu和io消耗网络带宽,无法使用覆盖索引,减少表结构带来的影响,select/join可能产生临时表,ps:不过在开发时期,可以使用这个,避免频繁更改)
  7. 不使用负向查询,例如 not in , != , not like(建议,无法使用索引,导致全表扫面,引起buffer pool利用率降低)

适用预编译语句

  1. 一次解析,多次使用
  2. 只传递参数,比传递sql更有效率
  3. 可以避免sql注入
  4. 会导致索引失效
  5. 必须是最左前缀
  6. 不可能用到两个范围条件。

避免使用存储过程,触发器,函数等,降低业务的耦合度,避开bug

避免使用大表的join,join消耗较多的内存,会产生临时表,mysql最擅长的是大表的主键/索引查询,不擅长数学运算

尽量减少和数据库的交互次数

合理的使用分页

upate ,delete 语句不使用limit(必须)

拒绝大的sql,拆分成小的sql , 充分利用query cache,充分利用多核cpu

同一个字段,将or 改成in,建议in小于500个,or的效率为O(n),in的效率为O(Log n)

不同的字段,将or 改为union all

Leave a comment

Your email address will not be published.

*