2

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

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.7 秒

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.008s。有了这个,我认为简单地执行两个单独的查询然后使用 PHP 比较它们会更有效但更丑陋。

4

1 回答 1

0

如果这看起来有点基本,请原谅我,但我发现将内容回归基本可以澄清我的想法。

索引是一种组织数据的方式,创建数据时需要付出代价。考虑将纸质文件存储在故障柜中。存放它们的最快方法是将它们塞在合适的地方,但如果您以后需要找到一个,则需要检查抽屉中的每一页。相反,如果您想按日期顺序存储它们,则表示您在放入它们时需要花费更多时间,但找到它们所需的时间更少。

所以这是你的权衡 - 你拥有的索引越多,你的 INSERTS 越慢,但你的 SELECTS 越快,其中 DELETES 和 UPDATES 落在中间的某个地方。

对于一个普通的用户生成/访问的表,通常会有比其他任何东西更多的 SELECTS,并且它们会触及更多的行,因此需要进行广泛的索引。对于日志表,会有更多的 INSERTS,所以要谨慎使用索引。

但是,按照创建顺序对记录进行排序的索引的开销远小于需要在中间粘贴新记录的索引,因此在创建日期时间索引的日志表不会有很大的开销。

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

希望这可以帮助。

于 2013-01-14T21:42:50.080 回答