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

标签 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

典型的查询是: 哪些对象在 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/

相关文章:

php - 管理员和用户登录php mysql表单

php - 使用 JSON 发送和读取

php - 使用php计算无序列表中列表项的总数

JavaScript : Parameter Passed Is "Not Defined"

php - 将 TIMESTAMP 和时区转换为不同的时区

mysql - 不要在我的 mysqli 查询上显示过期结果

mysql - MariaDB *.myi 文件没有出现在文件管理器中

MYSQL查询减少条件中的内部查询

java - 使用 Spring JPA 未将 Rest api 响应数据保存在数据库中

php - Elasticsearch - 希望在该特定字段可用或不可用的所有索引中按字段排序,如果不可用,则避免它