在MYSQL中,当存在除key_name以外的所有内容相同的重复索引时,这意味着什么?

7
describe etc_category_metadata;

+---------------------+---------------+------+-----+---------+----------------+
| Field               | Type          | Null | Key | Default | Extra          |
+---------------------+---------------+------+-----+---------+----------------+
| id                  | int(11)       | NO   | PRI | NULL    | auto_increment |
| user_id             | bigint(20)    | NO   |     | NULL    |                |
| time_updated        | int(11)       | YES  |     | NULL    |                |
| category_type       | int(11)       | YES  | MUL | NULL    |                |
| status_keywords     | mediumblob    | YES  |     | NULL    |                |
| page_keywords       | mediumblob    | YES  |     | NULL    |                |
| profession_keywords | mediumblob    | YES  |     | NULL    |                |
| adgroup_ids         | mediumblob    | YES  |     | NULL    |                |
| prod                | tinyint(1)    | YES  |     | 0       |                |
| version             | int(11)       | YES  |     | 1       |                |
| status              | int(11)       | YES  |     | 0       |                |
| dep_category_ids    | mediumblob    | YES  |     | NULL    |                |
| custom_param        | mediumblob    | YES  |     | NULL    |                |
| queue_priority      | int(11)       | YES  |     | 1       |                |
| auto_requeue_num    | int(11)       | YES  |     | 0       |                |
| cloned_version      | int(11)       | YES  |     | 0       |                |
| custom_query        | varchar(1000) | YES  |     | NULL    |                |
| description         | varchar(1000) | YES  |     | NULL    |                |
| error_message       | mediumblob    | YES  |     | NULL    |                |
| time_last_completed | int(11)       | YES  |     | NULL    |                |
+---------------------+---------------+------+-----+---------+----------------+
21 rows in set (0.40 sec)

show index from etc_category_metadata;
+-----------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                 | Non_unique | Key_name        | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| etc_category_metadata |          0 | PRIMARY         |            1 | id            | A         |       12613 |     NULL | NULL   |      | BTREE      |         |               |
| etc_category_metadata |          0 | category_type   |            1 | category_type | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
| etc_category_metadata |          0 | category_type   |            2 | version       | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
| etc_category_metadata |          0 | category_type_2 |            1 | category_type | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
| etc_category_metadata |          0 | category_type_2 |            2 | version       | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
| etc_category_metadata |          0 | category_type_3 |            1 | category_type | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
| etc_category_metadata |          0 | category_type_3 |            2 | version       | A         |       12613 |     NULL | NULL   | YES  | BTREE      |         |               |
+-----------------------+------------+-----------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
7 rows in set (0.07 sec)

试图弄清楚是否安全删除键category_type_2category_type_3。看起来它们是与category_type完全相同的索引。这是一个我不知道谁在很长时间前创建的遗留表。有任何有效原因会导致人们创建这三个看起来是重复的密钥吗?

3个回答

11

拥有两个完全相同的索引是一种浪费磁盘空间并且会稍微减缓INSERTs的速度。没有任何好处。

你无法从DESCRIBE TABLE中看到它们是否重复。相反,使用SHOW CREATE TABLE命令。注意UNIQUE/否、前缀/否、常规/FULLTEXT、手动创建/由FOREIGN KEY创建等情况。

一旦你确定它们是完全相同的(除了名称),就删除一个。还有其他情况下可以删除索引。假设你有这3个索引:

INDEX(a,b)  -- keep this
INDEX(a)    -- unnecessary
INDEX(b)    -- keep

或者这一对:

UNIQUE(a)   -- keep; same as INDEX(a), plus a uniqueness check
INDEX(a)    -- drop

再来看这个例子:

INDEX(a,b)  -- keep; provides composite index
UNIQUE(a)   -- keep; provides uniqueness check

(还有更多的组合。)

3

是的,你在同一列上有重复的索引,因此如果你没有给这些索引命名,mysql会自动添加一个数字。在我看来,mysql甚至不应该允许重复的索引存在。删除它们是安全的。

DROP INDEX category_type_2  ON etc_category_metadata

并对其他内容进行相同的操作


2

在同一列上使用相同排序的多个索引是没有充分理由的。在当前MySQL数据库上执行创建索引语句仍将成功(出于向后兼容性的原因),但会发出警告:

在表'db.table_name'中定义了重复索引'index_name'。这已过时,并将在未来的版本中被禁止。

如果您有这样的预先存在的重复索引,没有理由不将它们删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接