业务代码组合逻辑后进行数据库操作,如根据波次进行库存分配,可以将波次里面的订单所有明细进行分组,然后匹配库存。
2、将大字段、不常用字段放置到扩展表中,将经常使用(状态、数量、编号)放到一张表中,预防经常查询所有字段带来很多网络流量开销。
3、尽量使用主键进行加锁,防止间隙锁带来锁冲突。
4、热点数据更新放到事务最后,并制定更新顺序(如库存扣减、可以通过按照主键ID、货品ID排序更新)。
5、减少大事务,可以将大事务拆分多个小的独立事务(根据业务情况确定是否可以拆分),可以从两个维度(1、节点状态变更:如分配后自动生成拣货任务,就可以拆分两个事务,通过消息队列异步处理另一个状态。2、批量数据单个执行,如选择多个波次执行一个操作,后台可以逐个波次执行)。
6、合理调节数据库最大连接数、innodb buffer大小。
7、合理使用服务器内存缓存,配合消息队列清理缓存,来减少MYSQL的配置数据访问。
8、表之间转移/归档数据,少用insert into select where语句,防止select的where未走索引,加上其他事务更新表产生死锁。
9、业务报表数据尽量通过job定时跑数据生成(业务时间加上索引,job跑最近的业务数据、或则结合RowVersion增量统计),避免直接使用复杂的SQL语句查询业务表数据。
10、对于业务系统存在定时归档/关单的表,需要做好表重建工作,减少碎片以及存储空间。
11、对于非常大的表,尽量不要查询总条数,可以通过上一页,下一页的交互方式,后台通过小技巧取一个总条数返回给前端,如当前页的记录数等于每页需要展示的最大条数,则直接将总页数+1否在,总页数就是当前的页。
12、对于只需要根据一个条件做等值查询时,可以考虑通过分表减少每张表的数据量,如出库单日志表。
13、设计主从表(一对多)时,从表的外键不要设置为可空,可能导致join走不了索引。
14、网上提到的不要使用IN操作,走不了索引的说法是错误的,具体走不走索引需要根据执行计划分析(当in后面的数据在数据表中超过一定值就不会走)。
15、条件允许(如使用了可靠性很高的云服务器,不会意外断电等)的情况下将双一配置改为双100配置,提升数据库写入性能。