Многофайловое разделение MySQL против производительности одного файла? - PullRequest
4 голосов
/ 16 марта 2012

При разбиении большой таблицы у меня есть возможность установить флаг -innodb_file_per_table в TRUE или FALSE.True создаст много файлов (по одному на раздел) и значительно увеличит использование моего диска, но позволяет распределять разделы по разным томам (что я не планирую делать).FALSE сохранит таблицу как один большой файл.Предполагая, что я храню все файлы на одном логическом томе, могу ли я ожидать какой-либо существенной разницы в производительности запросов между этими двумя вариантами?Или, в более общем плане, есть ли какие-либо проблемы, которые следует учитывать при выборе между двумя вариантами, помимо использования диска и управления?

Некоторые характеристики:

  • общее количество таблиц: 20 (только несколько я заинтересован в разделении - см. мой другой вопрос )
  • самые большие таблицы имеют 100M записей.
  • общий размер дб составляет около 60G.

1 Ответ

7 голосов
/ 17 марта 2012

Как вы уже заявили, -innodb_file_per_table решит, будет ли одна таблица храниться в одном файле или (если разделена) во многих файлах.

Вот некоторые плюсы и минусы каждого подхода (необязательно полный список).

Single file per table                    Multiple files per (partitioned) table
--------------------------------------   --------------------------------------
+ System uses less filehandles           - System uses more filehandles
+ One one fsync per second per table     - Possibly many more fsync calls (bottleneck)
  (less fs overhead (journal etc))         (more fs overhead)
+ Single file uses less space overall    - Much larger disk space usage
- Single file fragments badly            + Less fragmentation 
- Optimize table (et al) takes longer    + You can choose to optimize just one file
- One file = one filesystem              + You can put heavy traffic files on a fast fs
                                           (e.g. on a solid state disk)
- Impossible to reclaim disk space       + possible to emergency-reclaim disk space 
  in a hurry (truncate table takes long)   fast (just delete a file)
- ALTER TABLE can use large % of disk-   + rebuilding with ALTER TABLE will use less
  space for temp tables while rebuilding   temp disk space

В общем, я бы не рекомендовал бы несколько файлов.
Однако если ваша рабочая нагрузка приводит к сильной фрагментации и optimize table занимает слишком много времени, использование нескольких файлов будет иметь смысл.

Забудьте о возврате пространства
Некоторые люди суетятся из-за того, что файлы таблиц InnoDB всегда растут и никогда не сжимаются, что приводит к потере места при удалении строк.
Затем они придумали схемы, чтобы освободить это пространство, чтобы не было свободного места на диске. (truncate table x).
Это будет работать намного быстрее с несколькими файлами, однако все это бессмысленно, потому что базы данных почти всегда растут и (почти) никогда не сжимаются, поэтому все, что освобождает пространство, будет тратить много времени (ЦП и IO) во время работы с вашей таблицей. полностью заблокирован (чтение и запись запрещены).
Только чтобы обнаружить, что ваш 90% заполненный диск (50% после восстановления) будет заполнен на 99% после добавления данных в следующие месяцы.

Однако при использовании ALTER TABLE будьте осторожны ...
Рассмотрим следующий сценарий:
- Диск заполнен на 60%.
- база данных занимает 50%, другие файлы - 10%.
Если вы введете alter table для любой таблицы, вам не хватит места на диске, если у вас есть все таблицы в одном файле.
Если у вас есть это в нескольких файлах, у вас не должно быть проблем (кроме передозировки кофеина от всего этого ожидания).

...