新零售系统实现中,常见问题及企业级解决方案

1、表的主键用数字还是uuid

先说结论,用数字。

UUID 是通用唯一识别码的缩写,其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。在数据库集群中,为了避免每个MySQL各自生成的主键产生重复,所以有人考虑采用UUID方式。

使用UUID的好处:
  • 使用UUID,分布式生成主键,降低了全局节点的压力,使得主键生成速度更快
  • 使用UUID生成的主键值全局唯一
  • 跨服务器合并数据很方便
使用UUID的缺点:
  • UUID占用16个字节,比4字节的INT类型和8字节的BIGINT类型更加占用存储空间
  • UUID是字符串类型,查询速度很慢
  • UUID不是顺序增长,作为主键,数据写入IO随机性很大
主键自动增长的优点:
  • INT和BIGINT类型占用存储空间较小
  • MySQL检索数字类型速度远快过字符串
  • 主键值是自动增长的,所以IO写入连续性较好

无论什么场合,都不推荐使用UUID作为数据表的主键,而是要利用数据库中间件来生成全局主键,比如使用中间件MyCat。

 

2、在线修改表结构的正确姿势

在业务系统运行的过程中随意删改字段,会造成重大事故。

常规的做法是业务停机,维护表结构,但是不影响正常业务的表结构是允许在线修改的。

ALTER TABLE 修改表结构的弊病:

由于修改表结构是表级锁,因此在修改表结构时,影响表写入操作
如果修改表结构失败,必须还原表结构,所以耗时更长
大数据表记录多,修改表结构锁表时间很久

解决方案:

使用Percona公司提供的免费的Percona-Toolkit工具包。其中的pt-online-schema-change可以完成在线修改表结构的功能。

pt-online-schema-change是如何在不锁表的情况下,完成修改表结构的?

举例,比如我们现在要修改一个order表的表结构,Percona的pt-online-schema-change这个工具会先拷贝order表的数据结构,创建一个新的数据表,然后在新的数据表上做结构上的修改。

在这之后,Percona会在原来的order表上创建一个触发器,只要原来的数据表有添加、修改、删除,就会同步到新的订单表,同时将原来的order表中的数据拷贝到新的订单表里。

这样在数据拷贝并同步完成,且原order表没有数据写入时,Percona就会删掉原来的order表,并将新创建的order表改为为order。

这样,Percona就在全称未锁表的状态下,实现了表结构的修改。

注:Percona-Toolkit的使用

 

 



Top