【问题标题】:In MYSQL, what does it mean when there are duplicate indices where everything but key_name is the same?在 MYSQL 中,除了 key_name 之外的所有内容都相同的重复索引时,这意味着什么?
【发布时间】:2015-08-30 06:51:13
【问题描述】:
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 的索引完全相同。这是一张旧表,我不知道很久以前是谁创建的。有人最终会创建这三个看似重复的密钥是否有任何正当理由?

【问题讨论】:

    标签: mysql indexing database-administration unique-index


    【解决方案1】:

    拥有两个相同的索引会浪费磁盘空间并减慢INSERTs(一点点)。没有任何好处。

    您无法真正看到它们是否与DESCRIBE TABLE 重复。相反,请执行SHOW CREATE TABLE。注意UNIQUE/not、prefixed/not、regular/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
    

    (还有更多的组合。)

    【讨论】:

      【解决方案2】:

      是的,你在同一列上有重复的索引,所以如果你没有给索引命名,mysql只需添加一个数字。IMO,mysql甚至不应该允许重复的索引。删除它们是安全的

      DROP INDEX category_type_2  ON etc_category_metadata
      

      对其他人也这样做

      【讨论】:

        【解决方案3】:

        没有充分的理由在相同的列上以相同的顺序创建多个索引。在当前 MySQL 数据库上发出这样的 create index 语句仍然会成功(出于向后兼容性的原因),但会发出警告:

        在表“db.table_name”上定义的重复索引“index_name”。这已被弃用,并且将在未来的版本中被禁止。

        如果您有此类预先存在的重复索引,则没有理由不删除它们。

        【讨论】:

          猜你喜欢
          • 2021-03-06
          • 2012-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多