新手用好MySQL的最佳实践

58 阅读3分钟

我的微信号:cyberdak ,欢迎加我交流

基础规范

  1. 数据库引擎只允许使用 InnoDB

  2. 数据库字符集默认使用utf8md4. 该字符串兼容utf8,支持存储 emoji 表情。

现在emoji表情真的非常流行

  1. 禁止在数据库中存储文件、图片等大二进制数据

文件、图片等数据,使用对象存储系统存储,比如阿里云的oss服务

  1. 禁止使用外键、存储过程、触发器、视图

  2. 禁止在线上环境做压测

线上环境压测,出问题就该跑路了

命名规范

  1. 库名、表名、列名必须使用小写+下划线分割方式
  2. 库名、表名、列名必须所见即所得,含义明确
  3. 从库以-s结尾
  4. 备份库以-bak结尾

表设计规范

  1. 禁止使用外键

如果业务上有完整性要求,那么使用程序保证。外键会使表之间耦合,影响update/delete的性能。

  1. 表必须有主键,推荐使用UNSIGNED整数为主键

列设计规范

  1. 永远使用正确的数据类型

能用int存储的就不用varchar;用long来存储ip,而不是varchar;使用datetime而不是varchar(20)来保存时间

  1. 使用char(1)取代varchar(1)

如果只存储一个字符,就使用char(1),varchar 会占用额外的空间

  1. 仅使用char来存储固定长度的字段

如果字段长度小于1000,使用char(1000)会比varchar(1000)浪费更多资源

  1. 酌情使用 tinyint / int / bigint ,数据范围为0 到255 / -2^31 (-2,147,483,648) 到2^31 - 1 (2,147,483,647) / -2^63 (-9223372036854775808) 到2^63-1 (9223372036854775807),占用大小为1/4/8字节

  2. 所有列都定义为NOT NULL并且设置默认值

  3. 使用varchar(20)存储手机号,而且不是用int

varchar 可以模糊查询;手机号不会做运算;手机号会比11位长,比如+86-1xxxxxxxxxx

索引规范

  1. 唯一索引以uniq_${字段名}来命名
  2. 非唯一索引以idx_${字段名}来命名
  3. 索引复合最左前缀规范,提高索引使用度

SQL优化

  1. 养成使用explain的好习惯

explain 是MySQL语句的分析和诊断工具,只有基于诊断数据才能真正做优化,否则就是无头苍蝇

  1. 禁止使用select * ,只获取需要使用的字段

查询额外的字段会导致额外的查询、传输成本,并且在某些场景会导致额外的回表操作

  1. 大数据量禁止使用limit + offset 做分页

limit + offset 是深度分页,会获取所有数据,然后丢弃不需要的数据,效率非常低。使用id辅助分页是合理的做法.

  1. 永远不要查询字段上使用函数

这会导致无法使用索引,退化为全表扫描,效率非常差。 反例:SELECT columns FROM table WHERE left (customer_code,2)=’AK’,正例:SELECT columns FROM table WHERE customer_code like ‘AK%’

  1. 隐式类型转换会导致索引失效,导致全表扫描,使用正确的数据类型查询。

如age 字段是int类型,使用sql :select name from table where age ="32" 就无法使用索引。

安全

  1. 不要在公网上暴露MySQL

有很多黑客会7*24扫描网络上的服务,你的MySQL随时会被攻击

  1. 使用一个复杂的root账号密码

理由同上,随机会被攻击,还有弱口令攻击,一旦攻击者获取root权限,后果不敢设想

  1. 为每一个数据库设定单独的账号密码

做到最小权限、权限分离,一个账号丢失、泄漏最多只会影响一个数据库