Mysql 为4+;上的几个不同查询创建索引;百万行表

Mysql 为4+;上的几个不同查询创建索引;百万行表,mysql,indexing,Mysql,Indexing,该表目前是一个超过400万(约50 GB)行的表,并且增长迅速 我们不希望包含EndTime无效因而小于StartTime的任何行,因为至少有1000行EndTime为零 我的问题是哪种索引最适合这三个查询? 我猜可能是一个综合指数,结束时间第一,开始时间第二 StartTime和EndTime字段都包含unix时间戳,如:1401951888 该表目前是一个超过400万(约50 GB)行的表,并且增长迅速 4M行,只有这3列,而且是50GB?哇!有什么问题吗 我们不希望包含EndTime无

该表目前是一个超过400万(约50 GB)行的表,并且增长迅速

我们不希望包含EndTime无效因而小于StartTime的任何行,因为至少有1000行EndTime为零

我的问题是哪种索引最适合这三个查询? 我猜可能是一个综合指数,结束时间第一,开始时间第二

StartTime和EndTime字段都包含unix时间戳,如:1401951888



该表目前是一个超过400万(约50 GB)行的表,并且增长迅速

4M行,只有这3列,而且是50GB?哇!有什么问题吗

我们不希望包含EndTime无效因而小于StartTime的任何行,因为至少有1000行EndTime为零

由于没有其他条件,查询必须处理整个表,减去1000行。因此,任何索引都是无用的

除非表中的列比您显示的要多,否则索引的唯一用途是比磁盘上的表小得多,因此扫描速度要快得多

现在,在MySQL的最新版本中,您现在可以在虚拟列上创建!因此,您可以在以下内容上创建索引:

endTime - startTime
如果max()和min()使用索引,它们将是即时的,因为在排序集中查找min/max是一个O(1)操作,只需要查看第一个或最后一个条目。但是,您的avg()当然必须检查所有行以计算平均值

该表目前是一个超过400万(约50 GB)行的表,并且增长迅速

4M行,只有这3列,而且是50GB?哇!有什么问题吗

我们不希望包含EndTime无效因而小于StartTime的任何行,因为至少有1000行EndTime为零

由于没有其他条件,查询必须处理整个表,减去1000行。因此,任何索引都是无用的

除非表中的列比您显示的要多,否则索引的唯一用途是比磁盘上的表小得多,因此扫描速度要快得多

现在,在MySQL的最新版本中,您现在可以在虚拟列上创建!因此,您可以在以下内容上创建索引:

endTime - startTime

如果max()和min()使用索引,它们将是即时的,因为在排序集中查找min/max是一个O(1)操作,只需要查看第一个或最后一个条目。但是,您的avg()当然必须检查所有行以计算平均值。

谢谢您的回答,这很有帮助。是的,还有其他大的blob列,因此大约为50GB。最后我做了这样一个复合索引:altertablesessions添加索引idx_次(EndTime,StartTime);现在。。。查询以秒为单位运行,而不是每秒钟运行将近一小时。。。这个带有EndTime的复合索引首先似乎对所有查询都起到了作用。再次感谢你的帮助!“诀窍”是查询可以完全在索引中运行。也就是说,查询中提到的所有列都在索引中,因此索引是“覆盖”的。不过,这是一个“索引扫描”。速度更快,因为要处理的数据更少。(UUID对性能来说很糟糕,但这是另一个讨论,在这里只稍微相关。)感谢您的回答,这很有帮助。是的,还有其他大的blob列,因此大约为50GB。最后我做了这样一个复合索引:altertablesessions添加索引idx_次(EndTime,StartTime);现在。。。查询以秒为单位运行,而不是每秒钟运行将近一小时。。。这个带有EndTime的复合索引首先似乎对所有查询都起到了作用。再次感谢你的帮助!“诀窍”是查询可以完全在索引中运行。也就是说,查询中提到的所有列都在索引中,因此索引是“覆盖”的。不过,这是一个“索引扫描”。速度更快,因为要处理的数据更少。(UUID对性能来说很糟糕,但这是另一个讨论,在这里只稍微相关。)
endTime - startTime