【问题标题】:mysql innodb: delete takes secondsmysql innodb:删除需要几秒钟
【发布时间】:2013-08-15 11:17:07
【问题描述】:

我不知道,为什么删除 innodb 表需要大约 30 秒

表格有 400 万行

ID 索引

KID 索引

(那只是索引,没有主索引,没有唯一性,因为表是分区的) 表已分区

 delete from my_table where id = 'xxx' and kid = 'ds54f5sad6w5' limit 1

在慢日志中是 查询时间 39 秒 锁定时间 36 秒 检查的行数 96879

问题出在磁盘上(使用了ssd)

解释 select sql_no_cache * from my_table WHERE id = '1663903' AND kid = '84d4af871929d2159d7d7399a79bb384' LIMIT 1

解释写入

id select_type table    type        possible_keys key    key_len ref  rows Extra
1  SIMPLE      my_table index_merge id,kid        id,kid 3,98    NULL 1    Using intersect(id,kid); Using where

【问题讨论】:

  • 你的主键是什么?尝试仅按该键删除。
  • 请张贴您表中存在的键。还可以尝试SHOW INDEXES 语句来确定您的密钥基数。
  • 您要删除任何条记录?当然你不想要order by
  • 阅读此dba.stackexchange.com/questions/48072/… 为什么您应该始终在刚刚编写的 innodb 表上创建主索引或唯一索引并将其发布在 dba stackexchange 上
  • 你应该运行 EXPLAIN PARTITIONS 来查看你的查询是否使用了分区修剪

标签: mysql innodb


【解决方案1】:

您的 EXPLAIN 显示您的查询正在使用“index_merge”访问 type

所以它必须搜索两个索引(这些在keys字段中显示),找到相关条目,然后找到两个结果之间的交集。

这可能比非索引搜索要好,但通常最好在 (id, child) 之上创建一个包含两列的单个索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多