代码之家  ›  专栏  ›  技术社区  ›  Julien Genestoux

不需要的mysql索引

  •  0
  • Julien Genestoux  · 技术社区  · 15 年前

    我们的数据库中有一个表开始非常大: 10m排 数据2.14g
    指数为3.55g

    我很惊讶地看到指数几乎是数据本身的两倍大:/

    所以我展示了指数:

    show index from entries;
    +---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | Table   | Non_unique | Key_name                               | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | entries |          0 | PRIMARY                                |            1 | id          | A         |    13538389 |     NULL | NULL   |      | BTREE      |         | 
    | entries |          0 | index_entries_on_link_and_feed_id      |            1 | link        | A         |    13538389 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          0 | index_entries_on_link_and_feed_id      |            2 | feed_id     | A         |    13538389 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          0 | index_entries_on_unique_id_and_feed_id |            1 | unique_id   | A         |    13538389 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          0 | index_entries_on_unique_id_and_feed_id |            2 | feed_id     | A         |    13538389 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          1 | index_entries_on_feed_id               |            1 | feed_id     | A         |       81556 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          1 | index_entries_on_time                  |            1 | time        | A         |      967027 |     NULL | NULL   | YES  | BTREE      |         | 
    | entries |          1 | index_entries_on_created_at            |            1 | created_at  | A         |      846149 |     NULL | NULL   | YES  | BTREE      |         | 
    +---------+------------+----------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    8 rows in set (1.35 sec)
    

    据我所知,我们的代码使用所有的索引,但是一些信息可能会重复:我认为索引 index_entries_on_feed_id 可能是重复的,因为两者都是 index_entries_on_link_and_feed_id index_entries_on_unique_id_and_feed_id 用它。

    我说的对吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Mike Woodhouse    15 年前

    一些观察:

    如果unique-i d真的是唯一的,那么我会仔细检查feed-i d是否真的是必要的:即使是一个字段的查找,性能上的增益也是非常小的。

    ID(主要)和唯一ID有什么区别?

    如果您以几种不同的方式为一个相对较小的行编制索引,那么索引使用的空间可能比数据大。

    10米长的行并不是很大,除非你扫描整个东西,在这种情况下,它太大了。如果您的查询能够适当地使用索引,那么对于另外100万行或更多行来说就不重要了。

    如果您要编写任何中等复杂的查询,包括加入2或3个表,我强烈建议您使用Explain来检查查询计划-我已经从手动调优复杂的MySQL查询中获得了一些令人惊讶的改进。

        2
  •  -1
  •   oneee    15 年前

    可以使用explain和SQL查询来获取有关已使用索引的信息。 如果没有使用某些索引,可以删除它们。

    此外,您的指数: 索引\u链接\u和\u源\u id上的\u项 索引唯一的和饲料的

    是一样的,即使它们的大小是一样的,所以你可以删除它们…