Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中,我可以在时间戳函数上创建索引吗_Mysql_Indexing - Fatal编程技术网

在MySQL中,我可以在时间戳函数上创建索引吗

在MySQL中,我可以在时间戳函数上创建索引吗,mysql,indexing,Mysql,Indexing,我有一个包含数百万行的表,包括一个日期和一个时间列 更改表结构不是一个选项,尽管可以添加新索引 考虑到这一问题: SELECT * FROM Table WHERE TIMESTAMP(Date, Time) BETWEEN 'X' AND 'Y'; 我在日期和时间列上有索引,在日期和时间列上也有索引,但是当我使用TIMESTAMP函数时,查询不使用索引 问题是,我可以制作一个使用时间戳函数(而不是数据类型)的索引吗。如果没有,有没有办法更改上面的查询以使用索引 我试图使查询简洁明了,并尽可能

我有一个包含数百万行的表,包括一个日期和一个时间列

更改表结构不是一个选项,尽管可以添加新索引

考虑到这一问题:

SELECT * FROM Table WHERE TIMESTAMP(Date, Time) BETWEEN 'X' AND 'Y';
我在日期和时间列上有索引,在日期和时间列上也有索引,但是当我使用TIMESTAMP函数时,查询不使用索引

问题是,我可以制作一个使用时间戳函数(而不是数据类型)的索引吗。如果没有,有没有办法更改上面的查询以使用索引

我试图使查询简洁明了,并尽可能避免重复每个日期

编辑:

因此,由于MySQL不支持表达式索引,有没有办法将此查询更改为使用日期或(日期、时间)索引?

这称为表达式索引,但并非所有RDBMS品牌都支持此功能

在MySQL中不能这样做

最接近的是,这是MySQL的一个分支MariaDB所支持的。但是如果您不能更改模式,我想切换到另一个RDBMS包也是不可能的

PostgreSQL是RDBMS的一个例子,它


作为一种解决方法,我建议只对日期列进行筛选,如果该列上有索引,则可以显著缩小搜索范围

SELECT * FROM Table WHERE Date BETWEEN 'Xdate' AND 'Ydate' 
  AND CASE WHEN Date = 'Xdate' THEN TIMESTAMP(Date, Time) >= 'X' 
           WHEN Date = 'Ydate' THEN TIMESTAMP(Date, Time) <= 'Y'
           ELSE 1 END;
从日期介于“Xdate”和“Ydate”之间的表中选择*
当Date='Xdate'然后TIMESTAMP(Date,Time)>='X'

当Date='Ydate'然后TIMESTAMP(Date,Time)时,我的建议是重写查询,并反转函数以仅从X和Y时间戳生成日期和时间:

SELECT * 
FROM Table 
WHERE (Date, Time) >= ('Xdate', 'Xtime') 
  AND (Date, Time) <= ('Ydate', 'Ytime') ;

这样,就不需要调用
TIMESTAMP()
函数。

Aha!太棒了,这大大加快了查询速度。谢谢:)2分钟后我才能接受答案。案例陈述中的其他1意味着什么?1是MySQL的“真”值。如果日期既不是范围内的第一个也不是最后一个,而是介于两者之间,那么它肯定在X和Y时间戳之间。但是我认为它需要对这个案例进行一个小的修正,
'Xdate'='Ydate'
(它只会检查这个案例的开始时间,而不是结束时间)@ypercube,很好的观点,但我可以假设这个案例并不常见,尝试覆盖它会使查询和优化器的工作复杂化,但收获甚微。是否允许您执行相反的操作(将常量时间戳转换为(日期,时间)组合?
WHERE(date,time)>=(Xdate,Xtime)和(date,time)@ YPyCube,就索引搜索而言,我不认为表达式在<<代码>日期> <代码> >我给出的例子中有任何好处。上面的语句是否考虑过午夜的时间?乍一看,它看起来不是这样的吗?是的,它是。你指的是午夜时分的时间吗?时间通常从<代码> '00:00时'>/code>至
'23:59.59'
您是否允许该列的时间为负值或大于
24:00:00
?对不起,我将自己与我正在编写的另一条语句混淆,该语句未跨越整个24小时。此查询也将起作用,谢谢!+1
SELECT * 
FROM Table 
WHERE 'Xdate' = 'Ydate'
          AND Date = 'Xdate' AND Time >= 'Xtime' AND Time <= 'Ytime'
   OR 'Xdate' < 'Ydate'
          AND ( Date = 'Xdate' AND Time >= 'Xtime'
             OR Date > 'Xdate' AND Date < 'Ydate'
             OR Date = 'Ydate' AND Time <= 'Ytime'
              ) ;