存储基于日期的可用性的最有效方法是什么

时间:2019-01-11 10:28:57

标签: php mysql database database-performance

我在这里是新来的,并且有一个项目,其中我遇到了一个似乎很难解决的性能问题。我创建了一个搜索,搜索具有可用性的对象意味着一个非常简单的结构:

ObjectID | Date | Number of available objects 
---------------------------------------------
Object1  | 01.01.2019 | 1
Object1  | 02.01.2019 | 1
Object1  | 03.01.2019 | 0
Object1  | 04.01.2019 | 1
Object1  | 05.01.2019 | 1
Object2  | 01.01.2019 | 1
Object2  | 02.01.2019 | 1
Object2  | 03.01.2019 | 0
Object2  | 04.01.2019 | 1
Object2  | 05.01.2019 | 1

我正在使用mysql和php

一个典型的查询是: 哪些对象在01.01.2019-28.02.2019之间可用,连续10天可用。

要使其与mysql配合使用并不是很困难,但是一旦您有10个以上的用户使用searchfunction,尽管对表进行了优化(索引等),服务器的负载也变得非常高。该服务器具有2个内核和4 GB内存。

我还尝试将每个对象用逗号分隔的日期存储在表中,并让应用程序进行搜索,但这在应用程序和数据库之间造成了极高的流量,这也不是真正的解决方案。

我们总共存储了约20.000个对象和可用性。 500天,因此我的第一个解决方案中大约有10.000.000个数据集。

有人知道这是最有效的方法吗? (如何存储它以便快速搜索?)

对于这个项目,我很遗憾无法缓存搜索。

谢谢您的帮助和亲切的问候,克里斯托夫

1 个答案:

答案 0 :(得分:0)

  • 不要以28.02.2019格式存储日期。将其翻转,然后在表中使用DATE数据类型。请提供SHOW CREATE TABLE
  • 您的搜索算法是什么?
  • 标头显示“对象数量”,但值似乎仅为0或1,就好像它是一个布尔标志一样?
  • 最大时间是多少? (如果低于64岁,我们可以玩一些面向位的技巧。)

通过查看相邻的行(如果使用MySQL 8.0,请参见LAG(),确定对象何时更改状态。保存那些日期。

从那开始,从这些日期之一开始获得“连续多少天”是又一跳。这将是一个简单的查询,如果您有合适的复合索引,此查询将非常快。