0

我正在尝试使用 php + mysql 设置某种警报机制。例如,假设我必须在一年中的不同时间缴纳一些税款。这些税收在不同年份开始和到期。

首先,我认为用当年的付款日期创建记录似乎很方便。

+---+----+------------+
|aid| id |    date    |
+---+----+------------+
| 1 |  1 | 2010-01-31 |
| 2 |  1 | 2011-01-31 |
| 3 |  1 | 2012-01-31 |
| 4 |  1 | 2013-01-31 |
| 5 |  1 | 2014-01-31 |
| 6 |  2 | 2012-04-30 |
| 7 |  2 | 2013-04-30 |
| 8 |  2 | 2014-04-30 |
| 9 |  2 | 2015-04-30 |
| 10|  2 | 2016-04-30 |
| 11|  2 | 2017-04-30 |
| 12|  2 | 2018-04-30 |
+---+----+------------+

因此,我可以在一个月或一周前通过类似以下的查询看到我的闹钟:

SELECT * FROM alarms WHERE date <= x_time_after_current_date

但是,从长远来看,将有数百万条记录。所以我决定像这样改变我的表结构。

+----+------------+------------+-------- -+
| id | first_date | begin_year | end_year |
+----+------------+------------+----------+
|  1 | 2010-01-31 | 2010       | 2023     |
|  2 | 2008-01-31 | 2008       | 2015     |
|  3 | 2012-01-31 | 2012       | 2015     |
|  4 | 2012-06-30 | 2012       | 2014     |
|  5 | 2005-04-30 | 2005       | 2015     |
|  6 | 2013-01-31 | 2012       | 2018     |
+----+------------+------------+----------+

但我不确定哪个是最佳实践,我应该如何为最后一个示例设计查询?

4

1 回答 1

1

老实说,查询具有数百万条记录的表实际上并没有什么问题,只要您对表进行了正确的索引,您有足够的内存分配给 MySQL 以将经常引用的索引保存在内存中,并且您正确地利用这些索引来查询它.

只要您有一个索引,我认为您的第一个表结构没有任何问题date

在您的第二个示例中,您可能无法有效地使用索引甚至查询表,因为您只关心first_date字段的月份和日期部分以进行查询,这意味着您需要查询相应的数据函数,这样您将无法使用该字段上的索引。这种方法还会在跨年份查询日期时引入一些奇怪的边缘案例逻辑,这将导致不必要的复杂查询。

于 2012-12-20T21:57:16.850 回答