DB Indexing&用于日志记录的查询优化

时间:2013-01-14 06:57:01

标签: mysql sql query-optimization

对于结构为的任何给定日志记录表:

CREATE TABLE `example` (
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `quantity` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
  `price` varchar(15) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在每分钟插入条目的情况下,我理解保留此表没有索引更有效。但是,当我尝试将类似的表与SELECT

进行比较时,会出现问题

以下查询的平均速度为~3.7s

SELECT * FROM (
    SELECT `t1`.`time`,
           `t1`.`quantity` AS `q1`,
           `t1`.`price` AS `p1`,
           `t2`.`quantity` AS `q2`,
           `t2`.`price` AS `p2`
    FROM `example 1` AS `t1`,
         `example 2` AS `t2`
    WHERE `t1`.`time` = `t2`.`time`
    ORDER BY `time` DESC LIMIT 72
) AS dt ORDER BY time ASC;

有没有办法大幅减少此查询所需的时间?一个类似的查询,

SELECT * FROM (
    SELECT *
    FROM `example`
    ORDER BY `time` DESC LIMIT 72
) AS dt ORDER BY time ASC;

只需要~0.008秒。有了它,我认为它会更有效但是更简单地执行两个单独的查询然后使用PHP进行比较。

1 个答案:

答案 0 :(得分:0)

请原谅我,如果这看起来有点基础,但我发现剥离基础知识可以澄清我的想法。

索引是一种组织数据的方式,在创建数据时需要付出代价。考虑将纸质文件存储在故障机柜中。存储它们的最快方法是将它们塞进适合的任何地方,但如果您需要稍后找到它,则需要通过抽屉中的每个页面进行检查。如果您希望将它们存储在日期顺序中,则表示您需要花费更多时间才能将它们放入,但查找它们需要的时间更短。

所以这是你的交易 - 你拥有的索引越多,你的INSERTS越慢,你的选择越快,DELETES和UPDATES就会落在中间位置。

对于普通用户生成/访问的表,通常会有比其他任何更多的SELECTS,并且它们将触及更多行,因此指示了广泛的索引。对于日志表,会有更多的INSERTS,所以要对索引保持谨慎。

但是,按照创建顺序对记录进行排序的索引的开销远小于需要在中间添加新记录的索引,因此在创建的日期时间索引的日志表不会产生巨大的开销。 / p>

此外,在您的情况下,每分钟1条记录的费率非常低,因此开销不太可能重要;每秒几百次,在实时植物测井中并不罕见,是另一回事。

希望这有帮助。