不需要的MySQL索引

时间:2009-10-13 17:18:45

标签: sql mysql indexing

我们的数据库中有一个表开始变得非常大: 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和{{1}都是使用它。

我是对的吗?

2 个答案:

答案 0 :(得分:2)

一些观察结果:

如果unique_id确实是唯一的,那么我会仔细检查feed_id是否真的有必要:即使是单场查找,性能的提升也非常小。

id(主要)和unique_id之间的区别是什么?

如果您使用几种不同的方式索引相对较小的行,则索引很可能使用比数据更多的空间。

10M行并不是非常大,除非你扫描整个东西,在这种情况下它太大了。提供您的查询正在适当地使用索引,对于另外100M行或更多行应该不重要。

如果您正在编写任何中等复杂的查询,涉及加入2或3个表,我强烈建议使用EXPLAIN来检查查询计划 - 我通过手动调整复杂的MySQL查询获得了一些惊人的改进。

答案 1 :(得分:-1)

您可以使用EXPLAIN,然后使用SQL查询来获取有关已使用索引的信息。 如果未使用某些索引,则可以删除它们。

另外,你的指数:     index_entries_on_link_and_feed_id     index_entries_on_unique_id_and_feed_id

是相同的,即使它们的大小相同,所以你可以删除它们......