【问题标题】:the best index when having two timestamp columns in mysql在 mysql 中有两个时间戳列时的最佳索引
【发布时间】:2020-04-14 07:16:21
【问题描述】:

我的 MySQL 数据库 start_time 和 end_time 中有两列。他们都是TIMESTAMP。我在这两列上创建了一个索引。

我有 350 万行。此查询需要 13 秒才能执行:

select * from test WHERE start_time > TIMESTAMP('2020-04-02 09:00:00') and end_time < TIMESTAMP('2020-04-02 10:00:00') 

有什么办法可以优化吗?

编辑:

CREATE TABLE `test` (
 `YYY` varchar(255) NOT NULL,
 `start_time` timestamp NULL DEFAULT NULL,
 `end_time` timestamp NULL DEFAULT NULL,
 UNIQUE KEY `index1` (`YYY`,`start_time`) USING BTREE,
 UNIQUE KEY `index2` (`YYY`,`start_time`,`end_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

【问题讨论】:

  • 不知道,我在一些问题中找到了解决方案。
  • 第二次回复是什么意思?
  • 哦,我弄错了,实际上是 end_time
  • 一次只能使用一个索引,因此 endtime 上的索引(可能为 NULL)不如 starttime 上的索引(可能不能为 null)有用。但是两者的复合索引可能最有用(一旦你摆脱了那些无意义的功能)
  • 我正在使用复合索引。当我摆脱这两个函数时,查询需要时间来执行,但结果告诉我它需要 0.000 秒!这正常吗?

标签: mysql database indexing


【解决方案1】:

不要费心让一个UNIQUE (index2) 以与另一个UNIQUE (index1) 相同的列开头。

没有针对这种“重叠”测试进行优化的索引(至少在 MySQL 中)。

如果您的时间范围不重叠(也就是说,没有两对 start..end 重叠,除了一个 end 匹配另一个 `start),那么我的 IP 范围技术可以很好地扩展。但这需要重组表格。 http://mysql.rjweb.org/doc.php/ipranges

【讨论】:

    【解决方案2】:

    我无法复制这个发现:

    EXPLAIN
        -> SELECT *
        ->   FROM test
        ->  WHERE start_time >= '2020-04-02 09:00:00'
        ->    AND end_time <= '2020-04-02 10:00:00';
    +----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
    | id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows   | Extra                    |
    +----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
    |  1 | SIMPLE      | test  | index | NULL          | index2 | 267     | NULL | 262035 | Using where; Using index |
    +----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
    1 row in set (0.00 sec)
    

    实际上,我很惊讶使用索引,因为 YYY 不是过滤条件的一部分。无论如何,尝试不使用 YYY,或者尝试使用 YYY 作为索引中的第三个参数。并删除其他索引。

    【讨论】:

    • 在我的查询中没有使用索引。我用这个顺序(start_time,end_time)尝试了索引,但速度并不快(这个索引不能是唯一的)。但是,我尝试了这个顺序(start_time、YYY、end_time),它就像一个魅力。我不知道为什么,但我会这样,当我找到解决方案时,我会把它写成答案。 YYY 列帮助我使用 UNIQUE 索引,没有它我无法将索引设置为 UNIQUE。
    • 您是否将yyy 排除在测试之外? Using index 表示 * 不包含任何额外的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2011-09-28
    • 1970-01-01
    • 2019-03-24
    • 2016-09-16
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多