MySQL在实际应用中的规范(表定义SQL索引等)

Posted hanruikai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL在实际应用中的规范(表定义SQL索引等)相关的知识,希望对你有一定的参考价值。

 

统一规范

存储引擎: 请统一使用innodb存储引擎,特殊的数据库引擎必须通过DBA的评审。

字符集: 统一使用utf8字符集。这个要从应用程序、服务器、数据库的表、字段等全部统一起来。注意:mysql中的utf8mb4字符集,才是真正的utf8,请用这个。

作用范围:不要在MySQL存储大对象,比如图片、音乐等;不要用MySQL做Gis运算、全文检索;不使用存储过程、触发器、函数、外键,避免破坏数据库的性能和扩展性。

使用上限:

  • 每个MySQL实例,数据库不要超过50个;
  • 单数据库容量,不要超过500GB,否则分库;
  • 单表记录数量,不要超过5000W,否则分表;
  • 单表子段数量,不要超过30个,否则拆表;
  • 单张表中索引数量不超过5个,单个索引中的字段数不超过5个;
  • varchar字段最大值不超过1024;注意:VARCHAR(N)中的N表示字符数而非字节数

索引

  1. 数据量比较小,一般认为2000条以下不用建立索引
  2. 选择性很小的字段,比如status、type等,只有几个值,不需要索引。因为数据库查询数据只有两种方式,一种是可以快速定位到记录,另一种是全表扫描。比如status只有0或者1,在5000W数据里面各占一半,索引没有意义。
  3. 索引内容尽量短
  4. 索引最左匹配原则,防止索引不生效的情况,比如联合索引(a,b,c),如果查询 where b=? and c=?,索引不生效。
  5. 避免在索引列进行函数计算,会造成索引失效。比如 data_format(created_date)substring(short_name,0,6) = 'xjjdog'
  6. 不能使用%前缀模糊查询,因为无法使用索引,例如:WHERE name LIKE '%味道'
  7. 不能使用数据库端做全文检索操作。虽然它支持,也不要这么做。
  8. 索引的命名要有章可循:idx_前缀表明是普通索引,而 uk_前缀表明的是唯一索引

SQL规范

  1. 建议每个表默认包含三个字段:创建时间、更新时间和版本号,createdTime、updateTime和version
  2. 避免复杂SQL语句,拆分为单SQL,防止慢查询
  3. 不要在不同数据类型的字段上进行比较,避免字段类型转换造成性能损失
  4. 禁止使用select *进行输出,应该选择具体的字段进行输出。除了避免无用的字段造成传输上的性能损耗,还能在一定程度上避免敏感信息的泄漏。
  5. SQL中避免出现now()、rand()、sysdate()、current_user()等不确定结果的函数。
  6. 插入语句,不要直接使用 insert into table values(),而应该加入具体的字段,否则无法适应数据库变更情况。
  7. 在做批量插入时,一次性操作100-200条就可以,没必要把batch数量设置成上千上万。
  8. 禁止使用SELECT … FOR UPDAT,优先采用乐观锁实现。
  9. 多表关联不要超过3个,尽量拆分成简单的SQL处理。
  10. 应该尽量使用UNION ALL来代替UNION。
  11. 注意OR语句的一些改善情况。比如WHERE id=1 OR id=2可以 改写为WHERE id IN(1,2)。在不同的字段,可以将OR改写为UNION ALL

命名规范

数据库表和字段的命名,不要使用驼峰命名方式。比如,不能叫saleOrder,而应该叫做sale_order。因为大多数数据库,都不区分大小写,下划线命名会更安全。

 

安全性方面

  1. 环境隔离,开发环境、测试环境、性能测试环境相互隔离
  2. 账号隔离
  3. 权限隔离

参考文:https://juejin.cn/post/6915275084047482894

 

 

以上是关于MySQL在实际应用中的规范(表定义SQL索引等)的主要内容,如果未能解决你的问题,请参考以下文章

优化分析Mysql表读写索引等操作的sql语句效率优化问题

MySQL 设计与开发规范

MySQL高性能优化规范建议,速度收藏

开发规范

开发规范

mysql学习笔记