2009-10-13 3 views
0

У нас есть один из наших таблиц в нашей базе данных, которая начинает быть довольно большим: 10M строк 2,14 г для данных
3.55G для индексовUnneeded MySQL индексы

Я был очень удивлен, увидев, что индексы почти вдвое больше, чем сами данные:/

так я показал показатели:

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 его используют.

Я прав?

+0

Я бы ожидал, что MySQL не будет * использовать эти другие индексы, потому что feed_id не является первым полем в последовательности. Вы не должны удивляться тому, что индексы иногда занимают больше места, чем данные. – Joe

+0

интересный. Означает ли это, что если я изменю порядок в любом из index_entries_on_link_and_feed_id или index_entries_on_unique_id_and_feed_id, мне не нужен индекс index_entries_on_feed_id? –

ответ

2

Несколько наблюдений:

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

В чем разница между id (primary) и unique_id?

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

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

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

+0

Спасибо, Майк. Уникальный_ид на самом деле является «внешним данным», поэтому имя может вводить в заблуждение. На практике мы обнаружили, что он не уникален в нашей БД, а уникален в контексте внешних данных. (Подумайте об этом как о элементе , если, например, в каналах подачи ATOM). Итак, я думаю, что наша ситуация в порядке. Пока у нас нет реального влияния на производительность ...это просто, что я хотел быть уверенным, что мы не «переиндексируем», для будущей масштабируемости, поскольку эта БД имеет много записей, и довольно мало выбирает (80%/20%), а записи - это количество значение индекса. –

-1

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

Кроме того, ваши показатели: index_entries_on_link_and_feed_id index_entries_on_unique_id_and_feed_id

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

+0

Ну, нет, они разные индексы! И они используются разными запросами:/и да, мы использовали EXPLAIN и все индексы используются ... что не означает, что если мы удалим один, решатель запросов не будет пытаться использовать -successfully-another one:/ –

Смежные вопросы