【发布时间】:2010-12-31 12:53:40
【问题描述】:
我有一些删除查询要针对一些非常大的表(~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创建一个单独的索引吗?还是组合主键可以做到?
我想这些都是非常基本的问题,但我找不到针对我的具体情况的明确答案,所以任何帮助将不胜感激!
【问题讨论】:
-
您的第一步是在删除语句上使用
EXPLAIN并找出它在做什么。如果需要,请粘贴。 -
EXPLAIN仅适用于SELECT语句(目前)。 -
我认为 column1 是
DATETIME而不是DATE?否则使用一个小时的间隔会很愚蠢。 -
好的,然后在等效的 SELECT 上执行
EXPLAIN。EXPLAIN SELECT * FROM table1 where column1 < date_sub(now(), interval 100 hour);
标签: mysql optimization indexing sql-delete