按时间戳日期组
问题描述:
如何按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中很明显。
但是你无法解决这个事实,即在分组(独立)操作期间需要中间表来保存日期。
如果不使用函数对其进行变异,则并不总是需要一个临时表来对索引列执行group by。如果有一个操作符而不是一个截断时间部分的函数,它可能会工作 – 2010-12-14 16:44:27
@x:嗯,我想我们都是对的。只要没有应用聚合函数,就可以(理论上)通过遍历索引获得不同值的列表,只保留先前输出的值以进行比较。当执行计数/总和等时,所有值都需要保持到分组操作结束。问题是:这是在数据库中实现的吗? :) – Ronnis 2010-12-14 17:00:17