【问题标题】:How to optimise a SQL query with a Timestamp如何使用时间戳优化 SQL 查询
【发布时间】:2021-08-30 07:46:24
【问题描述】:

我有一个超过 500k 行的表,我尝试使用索引来更快地获得结果。我有一个带有 BTREE 的 _Date_Time 的索引,它仅在我仅查询列 _Date_Time 时才有效。如何快速获得结果但包含所有列?我认为 TEXT 类型的列是个问题,因为它们没有长度。

SELECT _Date, _Time FROM logsTable
 WHERE TIMESTAMP(_Date, _Time)
 BETWEEN "2021-08-29T13:04" AND "2021-08-29T15:04" 
 LIMIT 135, 15;

#THIS IS THE INDEX THAT ONLY WORKS ONLY WITH _DATE AND _TIME
ALTER TABLE logsTable
ADD INDEX `logsTable_DateTime_Index` USING BTREE (`_Date`, `_Time`) VISIBLE;

表格列:

id int AI PK 
raw text 
type1 varchar(100) 
type2 varchar(100) 
desc text 
address1 varchar(100) 
address2 varchar(100) 
num varchar(100) 
_Date date 
_Time time 
serie varchar(100)
    

【问题讨论】:

    标签: mysql sql optimization


    【解决方案1】:

    解决方案是使用生成的列和索引

    DESC 是保留字,应始终避免使用 _date 或需要 r 使用反引号

    最后用我们的 ORDER By 限制行数不是一个好主意,因为您无法预测结果

    create table logsTable
    (
    id int AUTO_INCREMENT PRIMARY KEY,
    raw text ,
    type1 varchar(100) ,
    type2 varchar(100) ,
    `desc` text, 
    address1 varchar(100) ,
    address2 varchar(100) ,
    num varchar(100) ,
    _Date date ,
    _Time time ,
    serie varchar(100),
    mytime timestamp GENERATED ALWAYS AS (TIMESTAMP(_Date, _Time)) STORED 
    , INDEX `logsTable_DateTime_Index` (mytime));    
    
    EXPLAIN
    SELECT _Date, _Time FROM logsTable
     WHERE mytime
     BETWEEN "2021-08-29T13:04" AND "2021-08-29T15:04" 
    ORDER BY mytime
     LIMIT 135, 15;
    
    编号 |选择类型 |表|隔断 |类型 |可能的键 |关键 | key_len |参考 |行 |过滤 |额外的 -: | :------------ | :-------- | :--------- | :---- | :------------------------ | :------------------------ | :-------- | :--- | ---: | --------: | :-------------------- 1 |简单 |日志表 | |范围 | logsTable_DateTime_Index | logsTable_DateTime_Index | 5 | | 1 | 100.00 |使用索引条件

    db小提琴here

    【讨论】:

      【解决方案2】:

      首先,我建议这样编写查询:

      SELECT _Date, _Time
      FROM logsTable
      WHERE _Date = '2021-08-29' AND
            _Time BETWEEN '13:04:00' AND '15:04:00' 
      LIMIT 135, 15;
      

      然后您想要在logsTable(_Date, _Time) 上建立索引。

      最后。 . .您正在使用 LIMIT 而没有 ORDER BY。不建议这样做。结果以不确定的顺序返回,并且可能会随着查询的一次运行而变化。

      【讨论】:

        【解决方案3】:

        基本上,您需要评估哪些列应该被索引,知道在这个特定应用程序中将执行哪些搜索操作。

        这是如何索引 TEXT 列的答案: https://dba.stackexchange.com/questions/210403/how-do-you-index-a-text-column-in-mysql

        其余列很简单 - 但您需要评估是否需要对它们建立索引,因为每个索引都会增加插入数据等操作的开销。

        【讨论】:

          猜你喜欢
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          • 1970-01-01
          • 1970-01-01
          • 2015-12-09
          • 2012-12-09
          • 1970-01-01
          相关资源
          最近更新 更多