Mysql存储非常大量的数据:UUID作为主键与任何其他逻辑

时间:2014-12-23 18:49:42

标签: php mysql database performance uuid

我正在开发Cakephp 2.0和mysql(InnoDB)中基于GPS设备的应用程序。每个设备每分钟向Db发送数据,我需要使其可以同时扩展到服务器的大量设备。

我没有使用BIGINT auto increment作为主键,因为有一个限制和最大值,超过该值就会达到BIGINT的限制,即使很远,系统也会崩溃。

我将主键创建为char(36)并从php生成UUID并开始存储数据。主要是因为主键的限制和唯一性永远不会停止,设计永远不会失败。

唯一性是我唯一的理由而不是别的。

问题:

  1. 系统处于试用测试模式,插入数据的时间已经大大增加。请参阅http://kccoder.com/mysql/uuid-vs-int-insert-performance/这种情况正好发生在我的情况下,随着时间的推移,插入数据的时间也在增加,并且随着数据数量的不断增加,我预计未来几天它可能会变得更糟。现在表中有大约2,00,000个数据。\
  2. 主键是char(36),我假设性能在插入,选择语句和连接中生效。
  3. 我的想法是用varchar(50)列替换主键UUID列,并将设备ID / IMEI号+时间戳存储为主键,它们将始终是唯一的。但在不利方面,从长远来看,它又是一个varchar领域和性能问题。

    从长远来看,对我来说最好的选择是什么?

1 个答案:

答案 0 :(得分:4)

只需使用BIGINT UNSIGNED

无符号INT64类似于4.000.000.000倍4.000.000.000。因此,假设您为每个不到80亿人每秒记录一次的设备配备了一台设备,那么您将获得20亿秒或超过63年的时间。我认为,在63年中,INT128是正常的(或小)。

我也很确定,在一张表中达到2 ^ 64行之前,你会遇到很多不同的麻烦。