【问题标题】:MySql Delete OptimisationMySql 删除优化
【发布时间】:2021-06-08 08:52:51
【问题描述】:

这是我要执行的查询

DELETE FROM testmachine WHERE workdone != 0 AND timetaken < 1617215400 LIMIT 1000;

执行查询需要 50 多秒。我想提高速度。

有什么办法可以减少执行时间?

这是我的列架构:

id  int UN AI PK
att text
ways    varchar(100)
mediuminv   text
mediumid    varchar(45)
timetaken   int
workdone    int
in_use  tinyint UN
status  tinyint
in  text
out text

这是索引:

Index: idx_time_taken_work_done_in_use_status

Definition:

    Type    BTREE
    Unique  No
    Visible Yes
    Columns done
        time
        in_use
        status

TIA

【问题讨论】:

  • WHERE workdone != 0 AND timetaken 这种情况是完全静态的吗?部分静态(1617215400 更改)?完全动态?
  • @Akina 它是部分静态的,workdone !=0 是静态的,所用时间会有所不同
  • workdone 值列表是 0/1 还是更宽?此查询是否用于删除所有按块匹配(但不限于)的行作为最终目标?
  • @Akina 更宽,存储部分时间戳
  • 测试以下所需的时间:1) 使用 WHERE 中使用的表达式创建虚拟生成列并使用它创建索引 2) 使用此列删除 3) 删除列和索引。也许它会更快,特别是如果您执行大量删除操作?

标签: mysql sql-delete database-optimization


【解决方案1】:

如果查询用在类似的地方:

REPEAT
    DELETE FROM testmachine WHERE workdone != 0 AND timetaken < 1617215400 LIMIT 1000;
UNTIL !ROW_COUNT() END REPEAT;

那就试试

ALTER TABLE testmachine 
    ADD COLUMN flag BOOLEAN AS (workdone != 0 AND timetaken < 1617215400) VIRTUAL,
    ADD INDEX idx_flag (flag);

REPEAT
    DELETE FROM testmachine WHERE flag LIMIT 1000;
UNTIL !ROW_COUNT() END REPEAT;

ALTER TABLE testmachine
    DROP INDEX idx_flag,
    DROP COLUMN flag;

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 2014-01-09
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2016-10-25
    • 2011-06-23
    相关资源
    最近更新 更多