Mysql 创建月和年列以加快时间戳查询
我在mariadb/mysql中有一个大日志表:Mysql 创建月和年列以加快时间戳查询,mysql,mariadb,Mysql,Mariadb,我在mariadb/mysql中有一个大日志表: CREATE TABLE `logs` ( `id` CHAR(36) NOT NULL, `user` CHAR(4) NOT, NULL, `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `dateUpdated` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY K
CREATE TABLE `logs` (
`id` CHAR(36) NOT NULL,
`user` CHAR(4) NOT, NULL,
`dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`dateUpdated` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
我正在尝试根据用户和按月份和年份创建的日期查询日志:
select * from logs where month(dateCreated) = '9' and year(dateCreated) = '2016' and user = '1234'
问题:
我是否应该创建两个名为“月”和“年”的列,并为“月”、“年”和“用户”编制索引以加快查询速度?您最好重新构造查询条件,以便更好地利用字段上可能的索引:
WHERE dateCreated >= '2016-09-01 00:00:00'
AND dateCreated < '2016-10-01 00:00:00'
AND user = '1234'
WHERE dateCreated>=“2016-09-01 00:00:00”
创建日期<'2016-10-01 00:00:00'
和用户='1234'
您最好重新构造查询的条件,以便更好地利用字段上可能的索引:
WHERE dateCreated >= '2016-09-01 00:00:00'
AND dateCreated < '2016-10-01 00:00:00'
AND user = '1234'
WHERE dateCreated>=“2016-09-01 00:00:00”
创建日期<'2016-10-01 00:00:00'
和用户='1234'
以两种方式对其进行基准测试。创建/维护列的开销可能远远超过缓存数据的任何好处。PK是表中不存在的列。明亮的无论如何,将日期存储为日期。并使用范围查询。以两种方式对其进行基准测试。创建/维护列的开销可能远远超过缓存数据的任何好处。PK是表中不存在的列。明亮的无论如何,将日期存储为日期。并使用范围查询。我是否需要为dateCreated和user编制索引?我所做的更改具体取决于dateCreated
上的索引是否有用;但是在用户
上设置一个,或者在两个字段上同时设置一个,也会有所帮助。从更大的角度来看,这实际上取决于您希望如何定期查询数据。例如,(dateCreated,user)
索引在基于用户
而没有dateCreated
进行查询的情况下不会有帮助,但如果您希望在dateCreated
而没有用户
的情况下经常进行查询,则仍然会有帮助。如果您重新排序该索引:(user,dateCreated)
。首先是常量测试,然后是范围。我需要索引dateCreated和user吗?我所做的更改特别依赖于dateCreated
上的索引才有用;但是在用户
上设置一个,或者在两个字段上同时设置一个,也会有所帮助。从更大的角度来看,这实际上取决于您希望如何定期查询数据。例如,(dateCreated,user)
索引在基于用户
而没有dateCreated
进行查询的情况下不会有帮助,但如果您希望在dateCreated
而没有用户
的情况下经常进行查询,则仍然会有帮助。如果您重新排序该索引:(user,dateCreated)
。首先进行常数测试,然后是量程测试。