我是新来的,有一个项目,我遇到了一个似乎很难修复的性能问题。我创建了一个对具有可用性的对象的搜索,这意味着结构非常简单:
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
典型的查询是: 哪些对象在 2019 年 1 月 1 日至 2019 年 2 月 28 日之间连续 10 天可用。
让它与 mysql 一起工作并不难,但是一旦有超过 10 个用户使用搜索功能,即使表被优化(索引等),服务器负载也会变得极高。服务器有 2 个内核,4 GB内存。
我还尝试将每个对象以逗号分隔的日期存储在表中,并让应用程序进行搜索,但这会在应用程序和数据库之间创建极高的流量,这也不是真正的解决方案。
我们总共存储了大约 20,000 个对象和可用性,最多可存储 20.000 个对象和可用性。 500 天,所以我们的第一个解决方案中有大约 10,000,000 个数据集。
有人知道最有效的方法是什么吗? (如何存储才能使搜索更快?)
对于这个项目,我遗憾的是无法缓存搜索。
感谢您的帮助和亲切的问候,克里斯托夫
最佳答案
- 请勿以
28.02.2019
格式存储日期。将其翻转,然后在表中使用DATE
数据类型。请提供SHOW CREATE TABLE
。 - 您的搜索算法是什么?
- 标题说“对象数量”,但值似乎只有 0 或 1,就好像它是一个 bool 标志??
- 最大时间跨度是多少? (如果低于 64,我们可以玩一些面向位的技巧。)
通过查看相邻行(如果使用 MySQL 8.0,请参见 LAG()
),确定对象更改状态的时间。保存那些日期。
从此,又需要一跳才能获得从这些日期之一开始的“连续多少天”。这将是一个简单的查询,如果您有合适的复合索引,查询速度会非常快。
关于php - 存储基于日期的可用性的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144661/