asp.net - 将 DATE/DATETIME 元素分成不同的列以便在 MySQL 中快速查询?

标签 asp.net mysql sql

我想将数据存储在MySQL中,并根据当天进行查询。我想知道这样做的最佳做法是什么。

我想存储每天的数据总计,这样查询总数据会很快。我想按如下方式对我的表进行建模:

TotalsByCountry
- Year
- Month
- Day
- countryId
- totalNumber

当我查询特定日期和特定国家/地区的总计时,我将根据 4 列(年、月、日和国家 ID)查询表。

我想知道这是否是一个好的做法,或者是否有更好的方法,比如对包含月、日和年的数据使用一列,并仅查询两列,即日期时间列和国家/地区 ID。

需要您帮助选择正确的表格建模方式。我还想制作另一个表来存储基于性别的总数,所以也要考虑到这一点。

数据将需要经常访问,也许是实时,因为我想实时显示数据变化。我将在 asp.net 中开发 Web 应用程序,并可能使用 Web 套接字创建持续连接,实时更新用户数据。所以当数据发生变化时,它会实时反射(reflect)在用户网页上。这就是为什么我需要一个可以为许多查询做好准备的表建模。我将使用缓存几秒钟,这样它就会给数据库带来太多压力。

我希望我提供了足够的信息,如果没有,请发表评论,我会回复。

最佳答案

使用三个单独的列来存储日期(年/月/日)的每个单独元素会在插入性能和磁盘空间方面增加数据库不必要的开销。

您要做的只是用一个DATETIME 列来存储日期和时间,并在(countryId, datetime_col) 上设置一个复合索引.

即使您想查询基于特定日期或月份的所有行,MySQL 仍然可以利用 DATETIME 字段上的索引,前提是您以正确的方式编写查询并确保永远不会 < em>在执行条件检查时将 DATETIME 列包装在一个函数中。

以下是如何编写查询,以便它仍然能够利用索引:

-- Get the sum of totalNumber of all rows based on current day
-- where countryId = 1

SELECT SUM(totalNumber) AS totalsum
FROM   tbl
WHERE  countryId = 1 AND
       datetime_col >= CAST(CURDATE() AS DATETIME) AND
       datetime_col <  CAST(CURDATE() + INTERVAL 1 DAY AS DATETIME)

通过在裸 DATETIME 列上进行比较,查询保持可搜索(即能够利用索引范围扫描)并且 MySQL 将能够使用索引快速查找行。

另一方面,如果您尝试将 DATETIME 列包装在函数中以进行比较:

-- Get the sum of totalNumber of all rows based on current day
-- where countryId = 1

SELECT SUM(totalNumber) AS totalsum
FROM   tbl
WHERE  countryId = 1 AND
       DATE(datetime_col) = CURDATE()

...这将是非常低效的,因为包装该列的 DATE() 函数有效地将查询呈现为不可搜索,并且您设置的任何类型的索引都包含 DATETIME 列不会被利用。

您还可以高效地查询当前中所有行的总和:

-- Get the sum of totalNumber of all rows based on current month
-- where countryId = 1

SELECT SUM(totalNumber) AS monthsum
FROM   tbl
WHERE  countryId = 1 AND
       datetime_col >= CAST(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-01') AS DATETIME) AND
       datetime_col <  CAST(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-01') AS DATETIME) + INTERVAL 1 MONTH

在当前内:

-- Get the sum of totalNumber of all rows based on current year
-- where countryId = 1

SELECT SUM(totalNumber) AS yearsum
FROM   tbl
WHERE  countryId = 1 AND
       datetime_col >= CAST(CONCAT(YEAR(NOW()), '-01-01') AS DATETIME) AND
       datetime_col <  CAST(CONCAT(YEAR(NOW()), '-01-01') AS DATETIME) + INTERVAL 1 YEAR

关于asp.net - 将 DATE/DATETIME 元素分成不同的列以便在 MySQL 中快速查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11496098/

相关文章:

c# - 我可以在 HTML.PartialRender() 中有变量吗?

sql - PostgreSQL:是否值得准备一个简单地调用存储过程并传递其参数的语句

SQL Server 2005 - 嵌套递归查询 :(

c# - 多个 httpmodule 实例

asp.net - 在 asp.net 中使用像公共(public)变量这样的类

c# - 无法打开登录请求的数据库 "aspnetdb"。登录失败

mysql - Drop Table if exists 语句给出错误

php - 我想从 mysql 数据库中获取复选框值

MySQL ALTER TABLE 创建 : 'Integrity constraint violation: 1452'

php - 执行mysql查询并在读取时显示结果