MySQL是否仍以这种方式处理索引?


8

在MySQL中删除重复索引需要花费相当长的时间,因此在等待期间,我进行了搜索并找到了2006年以来的这篇文章,谈论MySQL如何处理ADD和建立DROP索引。

如果表T是具有四个索引(ndx1,ndx2,ndx3,ndx4)的MySQL表,并且您想“更改表T的删除索引ndx3;” 这正是幕后发生的事情:

1)MySQL将T.MYD复制到临时表,即S.MYD和零字节的S.MYI。2)MySQL确实在表S上添加了索引ndx1(...);3)MySQL确实在表S上添加了索引ndx2(...);4)MySQL确实在表S上添加了索引ndx4(...);5)MySQL删除T.MYD并删除T.MYI 6)MySQL将S.MYD重命名为T.MYD,并将S.MYI重命名为T.MYI

这仍然是真的吗?他的建议仍然有效吗?

给定具有四个索引(ndx1,ndx2,ndx3,ndx4)的同一MyISAM表T,并且您要“更改表T的删除索引ndx3;” 试试这个代替:

1)创建像T一样的表T1;这将创建一个具有索引ndx1,ndx2,ndx3和ndx4的空表T1。2)alter table T1丢弃索引ndx3; 这会将索引ndx3丢弃在空T1上,该索引应该是瞬时的。3)插入T1中,从T中选择*;这将填充表T并一次性加载T1的所有三(3)个索引。4)放表T表;5)将alter table T1重命名为T;

大家如何处理大表中的索引添加和删除?

Answers:


14

这就是MySQL 4.x做到这一点的方式,它过去曾使我更加恼火。

实际上,我有一个公式可以计算出需要多少次索引操作

Table with 0 indexes and adding 1 index tooks 1 temp table
Table with 1 index   and adding 1 index tooks 3 temp tables
Table with 2 indexes and adding 1 index tooks 6 temp tables
Table with 3 indexes and adding 1 index tooks 10 temp tables (I had eyewitnessed this !!!)
.
.
.
Table with n indexes and adding 1 index took (n + 1) X (n + 2) / 2 temp tables
.
.
.
Table with 16 indexes and adding 1 index took 153 temp tables

好消息,MySQL 5.x无法做到!

如果MySQL 5.x做到了这一点,那么我今天将成为PostgreSQL DBA(对PostgreSQL不冒犯,它本身就是一个出色的RDBMS)。

更新

哦,天哪,我读了这篇文章!那个帖子来自我

我从没想过有人会挖这个帖子。

请把像这样的东西埋死。现在我有闪回!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.