我在这里是新来的,并且有一个项目,其中我遇到了一个似乎很难解决的性能问题。我创建了一个搜索,搜索具有可用性的对象意味着一个非常简单的结构:
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个数据集。
有人知道这是最有效的方法吗? (如何存储它以便快速搜索?)
对于这个项目,我很遗憾无法缓存搜索。
谢谢您的帮助和亲切的问候,克里斯托夫
答案 0 :(得分:0)
28.02.2019
格式存储日期。将其翻转,然后在表中使用DATE
数据类型。请提供SHOW CREATE TABLE
。通过查看相邻的行(如果使用MySQL 8.0,请参见LAG()
,确定对象何时更改状态。保存那些日期。
从那开始,从这些日期之一开始获得“连续多少天”是又一跳。这将是一个简单的查询,如果您有合适的复合索引,此查询将非常快。