Ненужные индексы MySQL - PullRequest
       12

Ненужные индексы MySQL

0 голосов
/ 13 октября 2009

У нас есть одна из наших таблиц в нашей базе данных, которая начинает быть довольно большой: 10 млн рядов 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 ]

2 голосов
/ 13 октября 2009

Несколько замечаний:

Если unique_id действительно уникален, то я бы тщательно проверил, действительно ли feed_id необходим: даже если это поиск по одному полю, выигрыш в производительности очень мал.

В чем разница между id (основным) и unique_id?

Для индексов вполне возможно использовать больше места, чем для данных, если вы индексируете относительно небольшую строку несколькими различными способами.

10M строк на самом деле не очень большие, если только вы не сканируете их целиком, в этом случае они слишком велики. При условии, что ваши запросы правильно используют индексы, это не должно иметь значения для еще 100 миллионов строк или более.

Если вы пишете какие-либо довольно сложные запросы, включающие объединение 2 или 3 таблиц, я настоятельно рекомендую использовать EXPLAIN для проверки плана запросов - у меня были некоторые неожиданные улучшения от ручной настройки сложных запросов MySQL.

0 голосов
/ 13 октября 2009

вы можете использовать EXPLAIN, а затем SQL-запросы для получения информации об используемых индексах. Если некоторые индексы не используются, вы можете отбросить их.

Также ваши показатели: index_entries_on_link_and_feed_id index_entries_on_unique_id_and_feed_id

одинаковы, даже их размер одинаков, поэтому вы можете удалить их ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...