fei*_*fei 5 mysql indexing optimization sql-delete
我有一些删除查询来运行一些非常大的表(~100 GB),我想尽可能优化它们:
delete from table1 where column1 < date_sub(now(), interval 100 hour);
Run Code Online (Sandbox Code Playgroud)
column1是一datetime列,我假设为此列创建索引将加速删除.除此之外,我能在这做什么吗?将使用该date_sub()功能减慢查询?我应该在运行查询之前计算该值吗?
delete from table2 where column2 = x;
Run Code Online (Sandbox Code Playgroud)
column2是table2的主键,因此根据mysql文档它已经是一个索引.我的问题是:索引类是PRIMARY,是否与INDEX?相同?我是否必须制作另一种INDEX加速指数?
delete from table3 where column3 = y;
Run Code Online (Sandbox Code Playgroud)
table3有一个复合主键,它是column3和column4.所以我有一个主键索引,但由于删除查询不使用column4,我应该为column3创建一个单独的索引吗?或组合的主键会这样做?
我想这些都是非常基本的问题,但我无法找到特定于我的情况的明确答案,所以任何帮助都将不胜感激!
Bil*_*win 11
如果您DELETE打算消除该表中的绝大多数行,那么人们经常做的一件事就是将您要保留的行复制到重复的表中,然后使用DROP TABLE或TRUNCATE更快地擦除原始表.
索引可能有助于查找需要删除的行,但删除需要更新索引.删除大量行后,索引可能不平衡,需要进行一些维护OPTIMIZE TABLE.
该DATE_SUB()函数是一个常量表达式(它不会逐行变化),因此查询优化器应该足够聪明,可以将其分解并执行一次计算.
您不需要为主键创建额外的索引.主键约束隐式创建一个索引,该索引提供与非主键索引相同的好处.
如果您的搜索条件引用索引的最左侧列,则复合索引可能与单列索引一样有用."可能"的警告是由于各个索引节点较大,因此需要更多内存来缓存索引,但这是一个足够小的因素,我不会创建整个其他单列索引.
我认为为此列创建索引将加快删除速度。
不正确,因为需要更新同一索引才能使该索引具有供将来使用的任何值。
使用 date_sub() 函数会减慢查询速度吗?
不,没关系,因为它不是基于列值。对列值执行的函数可确保索引(如果该列上存在索引)无法使用。
索引类型是“PRIMARY”,与“INDEX”相同吗?
确实如此,并且主要部分确保该索引中的值也是唯一的。
我是否必须创建另一个“INDEX”类型的索引来加快速度?
不,你不知道。MySQL 还根据类型限制可以在单个表上定义的索引的总大小。767 字节是InnoDB 表规定的索引前缀限制;MyISAM 表为 1,000 字节。
table3 有一个复合主键,即column3 和column4。所以我有一个主键索引,但由于删除查询不使用column4,我应该为column3创建一个单独的索引吗?或者组合主键可以做到这一点?
测试这两种设置并做出决定。我自己认为额外的索引是没有必要的。
| 归档时间: |
|
| 查看次数: |
6891 次 |
| 最近记录: |