我有一个数据库,负责处理脉冲测量。
模式如下所示:
id - monitorid - starttime - stoptime - pulses
每台监视器每10分钟提供一次信息。
目前,总计约有13000000行。
开始时间和停止时间是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 )
monitorid
必须是该索引中的前导列,否则该索引将不可用。
在此处阅读“ 8.2.1.3.2多部分索引的范围访问方法”一章以获取详细信息:https ://dev.mysql.com/doc/refman/5.7/en/range-optimization.html
他们写道:
对于BTREE索引,间隔可能适用于与AND组合的条件,其中每个条件使用=,<=>,IS NULL,>,<,> =,<=,!=, <>,BETWEEN或类似“模式”(其中“模式”不以通配符开头)。只要可以确定包含所有与条件匹配的行的单个键元组,就可以使用一个间隔(如果使用<>或!=,则可以使用两个间隔)。
只要比较运算符为=,<=>或IS NULL,优化器就会尝试使用其他关键部分来确定间隔。如果运算符是>,<,> =,<=,!=,<>,BETWEEN或LIKE,则优化器将使用它,但不再考虑其他关键部分。对于以下表达式,优化器使用第一个比较中的=。它还从第二个比较中使用> =,但不考虑其他关键部分,并且不将第三个比较用于间隔构造:
key_part1 =' foo'AND key_part2 > = 10 AND key_part3 > 10
(强调我
的意思)上面的意思是,在您的特定情况下,如果monitorid + starttime
将创建索引on ,则opimizec可以使用索引的两个部分,因为monitorid = $monid
在where子句中使用了该索引,但是在反向索引order的情况下starttime + monitorid
,第二个索引索引的一部分不可用,因为starttime > $certaintime
在where子句中使用了该索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句