MySQL删除语句优化

标签 mysql optimization indexing sql-delete

我有一些删除查询要针对一些非常大的表(~100 GB)运行,我想尽可能地优化它们:

delete from table1 where column1 < date_sub(now(), interval 100 hour);

column1 是 datetime 列,我假设为该列创建索引会加快删除速度。除此之外,我还能在这里做什么?使用 date_sub() 函数会减慢查询速度吗?我应该在运行查询之前计算该值吗?

delete from table2 where column2 = x;

column2 是 table2 的主键,因此根据 mysql 文档,它已经是一个索引。我的问题是:索引种类是PRIMARY,和INDEX一样吗?我是否必须制作另一个 INDEX 类型的索引以加快速度?

delete from table3 where column3 = y;

table3有一个复合主键,就是column3和column4。所以我有一个主键索引,但是由于删除查询不使用 column4,我应该为 column3 创建一个单独的索引吗?或者组合主键可以做到这一点?

我想这些都是非常基本的问题,但我找不到适合我的情况的明确答案,所以任何帮助将不胜感激!

最佳答案

如果您的DELETE 旨在消除该表中的绝大部分行,人们经常做的一件事就是只复制您想要保留的行到一个重复的表中,然后使用DROP TABLETRUNCATE 以更快地清除原始表。

索引可能有助于找到您需要删除的行,但删除需要更新索引。删除大量行后,索引可能会不平衡,需要使用 OPTIMIZE TABLE 进行一些维护。

DATE_SUB() 函数是一个常量表达式(它不会逐行变化),因此查询优化器应该足够聪明,可以将其分解并执行一次计算。

您不需要为主键创建额外的索引。主键约束隐式创建一个索引,该索引提供与非主键索引相同的好处。

复合索引可能与单列索引一样有用,前提是您的搜索条件引用索引的最左边的列。 “可能”的警告是由于单个 inode 更大,因此需要更多内存来缓存索引,但这是一个足够小的因素,我不会创建一个完整的其他单列索引。

关于MySQL删除语句优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1987375/

相关文章:

python - 由于某种原因,即使该项目在范围内,我仍然收到索引错误

Mysql join 多表分层数据

c++ - 如何将二进制 std::string 插入 BLOB

php - 空间替换为 " "的问题

PHP 分页 有限数量的记录,但不是全部

python - 算术表达式的优化 - 这种技术叫什么?

arrays - `replace` 与普通 `loop` 在 SBCL 中复制大型数组

java - 如何在 java apache 数学中使用 SimplexSolver 或 SimplexOptimizer?

indexing - 如何配置Druid索引槽容量?

MySQL 性能较慢 *with* 索引?