按时间戳日期组

问题描述:

如何按mysql中时间戳列的日期部分分组,并仍然利用该索引的优势?按时间戳日期组

当然你可以使用解决方案,如

select date(thetime) from mytable group by date(thetime) 

但此查询将无法在thetime使用索引,而是需要一个临时表,你是通过分组之前,把使用功能列它。

+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key   | key_len | ref | rows | Extra          | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 
| 1 | SIMPLE  | mytable  | index | NULL   | thetime  | 4  | NULL | 48183 | Using index; Using temporary; Using filesort | 
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+----------------------------------------------+ 

理论上,没有理由不能在该列的索引上使用范围扫描,也不需要临时表。有没有任何语法可以说服查询优化器执行查询来做到这一点?

从我能理解的数据库已经做到了你想要的?正在扫描索引(而不是表格本身),这在xplan中很明显。

但是你无法解决这个事实,即在分组(独立)操作期间需要中间表来保存日期。

+0

如果不使用函数对其进行变异,则并不总是需要一个临时表来对索引列执行group by。如果有一个操作符而不是一个截断时间部分的函数,它可能会工作 – 2010-12-14 16:44:27

+0

@x:嗯,我想我们都是对的。只要没有应用聚合函数,就可以(理论上)通过遍历索引获得不同值的列表,只保留先前输出的值以进行比较。当执行计数/总和等时,所有值都需要保持到分组操作结束。问题是:这是在数据库中实现的吗? :) – Ronnis 2010-12-14 17:00:17