Die*_*ter 2 mysql indexing performance time-series
我有一个数据库,我正在处理包含脉冲测量的数据库.
架构是这样的:
id - monitorid - starttime - stoptime - pulses
Run Code Online (Sandbox Code Playgroud)
每个监视器每10分钟提供一次信息.
目前,这相当于大约13 000 000行.
开始和停止时间是varchar(10),保存unix时间戳.可能不是我的情况最有效率.
几乎所有针对该表的查询都是'WHERE starttime> $ certaintime AND monitorid = $ monid'.所有这些查询目前都非常缓慢.
我有一个关于monitorid的索引.我还没有把它放在开始时间和停止时间上,因为我认为这会给我带来更好的基数,因为每10分钟的时间段是一个新值.我不确定这个推理.
所以,我的问题是:如何针对大多数面临的类似范围的查询优化此问题.索引启动时间?使用日期而不是时间戳重建表?
欢迎任何建议!
干杯,
迪特
在monitorid + starttime列上创建复合btree索引.
此索引可以为使用WHERE starttime > X AND monitorid = Y子句的查询提供最佳结果
CREATE INDEX name ON tablename( monitorid + starttime )
Run Code Online (Sandbox Code Playgroud)
monitorid必须是此索引中的前导列,否则索引将不可用.
有关详细信息,请
阅读"8.2.1.3.2多部分索引的范围访问方法"一章:https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html
他们写道:
对于BTREE索引,间隔可以用于与AND组合的条件,其中每个条件使用=,<=>,IS NULL,>,<,> =,<=,!=来比较关键部分和常量值, <>,BETWEEN或LIKE'pattern'(其中'pattern'不以通配符开头).可以使用间隔,只要可以确定包含与条件匹配的所有行的单个密钥元组(或者如果使用<>或!=则为两个间隔).
只要比较运算符为=,<=>或IS NULL,优化程序就会尝试使用其他关键部分来确定间隔.如果运算符是>,<,> =,<=,!=,<>,BETWEEN或LIKE,优化程序将使用它,但不再考虑关键部分.对于以下表达式,优化程序使用=来自第一次比较.它还使用了来自第二次比较的> =,但没有考虑其他关键部分,也没有使用第三个比较进行间隔构造:
key_part1 =' foo'AND key_part2 > = 10 AND key_part3 > 10
(强调我的)
上面的意思是,在你的特定情况下,如果monitorid + starttime将创建一个索引,那么opimizec可以使用索引的两个部分,因为monitorid = $monid在where子句中使用,但在反向索引顺序的情况下starttime + monitorid,第二个索引的一部分不可用,因为starttime > $certaintime在where子句中使用.