我有一些删除查询要针对一些相当大的表(~100 GB)运行,并且我想尽可能地优化它们:
delete from table1 where column1 < date_sub(now(), interval 100 hour);
第 1 列是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创建一个单独的索引吗?或者组合主键可以做到这一点?
我想这些都是非常基本的问题,但我找不到针对我的情况的明确答案,因此任何帮助将不胜感激!
If your DELETE
旨在消除该表中的绝大多数行,人们经常做的一件事就是仅将要保留的行复制到重复表中,然后使用DROP TABLE
or TRUNCATE
更快地擦除原始表。
索引可能有助于找到需要删除的行,但删除需要更新索引。删除大量行后,索引可能会不平衡,需要进行一些维护OPTIMIZE TABLE
.
The DATE_SUB()
函数是一个常量表达式(它不会逐行变化),因此查询优化器应该足够聪明,能够将其分解出来并执行一次计算。
您不需要为主键创建额外的索引。主键约束隐式创建一个索引,该索引具有与非主键索引相同的优点。
如果您的搜索条件引用索引的最左边的列,则复合索引可能与单列索引一样有用。 “可能”的警告是由于各个索引节点更大,因此需要更多内存来缓存索引,但这是一个足够小的因素,我不会创建整个其他单列索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)