高性能可扩展MySQL数据库设计及架构优化 电商项目(笔记)

时间:2022-12-15 19:51:51

准备

  mysql5.7  + sqlyog

数据库开发规范的制定

  数据库必须使用小写字母并用下划线分割(见名知意,最好不超过32字符)

  禁止使用mysql保留关键字(如有,``包裹),去http://dev.mysql.com/doc/refman/5.7/en/keywords.html

  临时库表必须以tmp为前缀并以日期为后缀(tmp_)

  备份库和库,必须以bak为前缀,日期为后缀(bak_)

  所有存储相同数据的列名和列类型必须一致。(在多个表中的字段如user_id)

  mysql5.5之前默认的存储的引擎是myisam,没有特殊要求,所有的表必须使用innodb(支持失误,行级锁,高并发下性能更好)

  数据库和表的字符集统一使用utf8【要统一,避免由于字符集转换产生的乱码】。汉字utf8下暂3个字节

  表和字段备注

  尽量控制单表数据量的大小在500w以内(并不是mysql数据库的限制,这种限制取决于存储设置和文件系统,可以使用历史数据归档,分库分表来实现)。

 

注意:

  谨慎使用mysql分区表(分区表在物理上表现为多个文件,在逻辑上表现为一个表)。

  谨慎选择分区键,跨分区查询效率可能更低

  建议使用物理分表的方式管理大数据

  尽量做到冷热数据分离,减小表的宽度(mysql限制最多存储4096列,行数没有限制,但是每一行的字节总数不能超过65535)【列限制好处:减少磁盘io,避免读入无用的冷数据】

  禁止在表中建立预留字段(无法确认存储的数据类型,无法选择合适的类型)

  禁止在数据中存储图片,文件二进制数据

  禁止在线上做数据库压力测试

  禁止从开发环境,测试环境直接连生产环境数据库

索引设计规范

  对查询性能非常重要(双刃箭)

  限制每张表上的索引数量,建议单表索引不超过5个(索引会增加查询效率,但是会降低插入和更新的速度)

  禁止给表中的每一列都建立单独的索引

  每个innodb表必须有一个主键(不能使用更新频繁的列作为主键),选择自增id

  

  常见索引建立建议:

    select ,update ,delete 语句的where从句的列

    包含order by ,group by ,distinct中的字段

    多表join的关联列

  如何选择索引列的顺序:

    区分度最高的列放在联合索引的最左侧

    尽量把字段长度小的列放在联合索引的最左侧

注意:

  避免建立冗余索引和重复索引

  尽量避免使用外键

数据库字段设计规范

  优先选择符合存储需要的最小数据类型

  优先使用无符号的整形来存储

  优先选择存储最小的数据类型(varchar(N),N代表的是字符数,而不是字节数,N代表能存储多少个汉字)

  避免使用text,blob类型

  尽量把所有的列定义为not null (索引null 需要额外的空间来保存,所以需要暂用更多的内存)

  使用timestamp或datetime类型来存储时间

  同财务相关的金额数据,采用decimal类型(不丢失精度)

  建议使用预编译语句进行数据库操作

  禁止跨库查询

   禁止select * 查询,消耗更多的cpu和io及网络带宽资源。

  避免使用子查询,可以把子查询优化为join操作

mysql分区表

  确认mysql服务器是否支持分区表:show plugins;

  在逻辑上为一个表,在物理上存储在多个文件中。