我有一些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。所以我有一个主键索引,但是由于delete查询没有使用column4,我应该只为column3创建一个单独的索引吗?或者组合主键可以做到这一点?
我想这些都是非常基本的问题,但我找不到针对我的情况的确切答案,所以任何帮助都将不胜感激!
发布于 2010-01-01 06:59:28
如果您的DELETE打算删除该表中的大部分行,那么人们通常会做的一件事就是将您想要保留的行复制到一个复制表中,然后使用DROP TABLE或TRUNCATE更快地清除原始表。
索引可能有助于查找需要删除的行,但删除需要更新索引。在删除大量行之后,索引可能会不平衡,需要使用OPTIMIZE TABLE进行一些维护。
DATE_SUB()函数是一个常量表达式(它不会逐行变化),因此查询优化器应该足够智能,能够将其提取出来并执行一次计算。
您不需要为主键创建额外的索引。primary key约束隐式创建一个索引,该索引具有与非主键索引相同的优点。
复合索引可能与单列索引一样有用,前提是您的搜索条件引用了索引的最左边的列。“可能”的警告是由于单个索引节点较大,因此需要更多内存来缓存索引,但这是一个足够小的因素,我不会创建一个完整的单列索引。
发布于 2010-01-01 06:51:29
我假设为这一列建立索引会加快删除速度。
不正确,因为需要更新相同的索引才能使该索引具有任何值以供将来使用。
使用date_sub()函数会减慢查询速度吗?
不,它很好,因为它不是基于列值的。对列值执行的函数确保不能使用索引(如果该列上存在索引)。
索引类型为"PRIMARY",是否与" index“相同?
它是唯一的,并且主部分确保该索引中的值也是唯一的。
我是否必须创建另一个类似于“索引”的索引来提高速度?
不,不需要。MySQL还根据类型限制了可以在单个表上定义的索引的总大小。767字节是InnoDB表的stated index prefix limitation;MyISAM表是1,000字节。
table3有一个复合主键,即column3和column4。所以我有一个主键索引,但是由于delete查询没有使用column4,我应该只为column3创建一个单独的索引吗?或者组合主键可以做到这一点?
测试两个设置并决定。我不认为额外的索引是必要的。
https://stackoverflow.com/questions/1987375
复制相似问题