当将大量数据插入表(来自另一个表,没有特定顺序)时,如何优化多列索引以便以尽可能最快的方式更新索引?
假设索引从未在任何SELECT
,DELETE
或UPDATE
查询中使用。*还假设列的非重复计数如下(例如):
COLUMN | DISTINCT COUNT
col1 | 634
col2 | 9,923
col3 | 2,357
col4 | 3
*在选择数据时不使用索引的原因是这是主键索引或唯一约束索引。索引已到位,以便违反约束的插入失败。
我已经读过,最具选择性的专栏应该是第一位的。这是正确的,然后是如下创建的索引?
(col2, col3, col1, col4)
如果这是错误的,您如何确定索引中列的最佳顺序,只会在相应的表中看到批量INSERT
?目标是在批量INSERT
期间加快索引的更新。
答案 0 :(得分:1)
最快的方法是DROP INDEX
,然后在完成插入后执行批量插入和CREATE INDEX
。
索引的正确结构与列中的值分布没有多大关系,但与检索策略有关,大概只针对UPDATE
和DELETE
,特别是当你对索引的某些但不是所有列进行部分过滤。那些更频繁的过滤器应该首先出现在索引列中。但是,如果是这种情况,您可能想要更彻底地重新考虑索引策略:拥有两个或更多索引以匹配典型的检索策略可能更好。
忽略无知的呼吁:为什么不将索引应用于SELECT
语句?索引非常有用 用于从表格中选择数据子集,无论是SELECT
还是合格UPDATE
或DELETE
。在这三个操作中的任何一个中使用索引都没有功能上的区别。
答案 1 :(得分:0)
列的顺序对于执行唯一性目的而言并不十分重要。但是,对于某些查询来说,一个唯一索引也不会有用,所以我会命令列来利用它。
为了快速批量插入此索引,我尝试按索引顺序插入。因此,在插入的选择部分添加order by (col2, col3, col1, col4)
。这样可以提高IO效率。