gpt4 book ai didi

mysql - 我应该在我的日期字段上放置一个索引吗?

转载 作者:行者123 更新时间:2023-11-29 00:20:22 24 4
gpt4 key购买 nike

我正在设计一个全新的数据库。每天都会有很多查询。它实际上是一个非常非常简单的时间会计系统,但我仍然希望尽可能快。我正在自己构建它,因为我可以,而且我可以节省一些钱,同时完全按照我想要的方式得到它,只是为了掌握我在不同项目中消耗的时间。

CREATE TABLE IF NOT EXISTS `activity` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`activity_date` date NOT NULL,
`minutes` int(11) NOT NULL COMMENT 'time for this activity (in minutes)
`week_nr` tinyint(2) unsigned NOT NULL COMMENT 'store weeknr for faster selection',
`year_nr` smallint(4) unsigned NOT NULL COMMENT 'store yearnr for fast selection',
`month_nr` tinyint(2) unsigned NOT NULL COMMENT 'store monthnr for faster selection',
PRIMARY KEY (`id`),
KEY `week_nr` (`week_nr`),
KEY `year_nr` (`year_nr`),
KEY `month_nr`, (`month_nr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci COMMENT='Table for storing activities' AUTO_INCREMENT=1 ;

当用户在上表中保存事件时,我的想法是更新 year_nrweek_nrmonth_nr在 activity_date 中,这样系统就可以很容易地获得事件报告,比如说第 5 周和第 10 周,或者第 5 个月(5 月)和第 10 个月(10 月)之间的事件。

这是一个好主意还是只在日期字段上放置一个索引更好?我的预测是会进行更多的选择查询,然后是更新。

最佳答案

考虑到以下提示,答案很简单:

Write queries for continuous periods as explicit range condition.

2013 年至 2014 年的示例:

WHERE activity_date >= '2013-01-01' and activity_date < '2015-01-01'

您需要做的就是计算边界日期,然后使用此模式。此模式可以在 activity_date 上使用直接索引——不需要额外的列/索引。只要您需要查询连续的时间段(而不是分散的时间段的“每个星期一”),它就可以工作。

不要对索引列应用任何函数。不要 YEAR(activity_date) 这是要避免的反模式:)

引用:http://use-the-index-luke.com/sql/where-clause/obfuscation/dates

关于mysql - 我应该在我的日期字段上放置一个索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21280649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com