我们的数据库中有一个表开始变得非常大:
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}都是使用它。
我是对的吗?
答案 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
是相同的,即使它们的大小相同,所以你可以删除它们......