Странные размеры таблиц MySQL - PullRequest
3 голосов
/ 09 января 2012

Я реализовал инвертированный индекс в MySQL, используя в основном эти три таблицы:

WORDS (word_id, word)
INSTANCES (word_id, doc_id)
DOCUMENT (id, text)

, где word_id равно INT и doc_id равно BIGINT

Затем япопытался отменить нормализацию таблиц WORDS и INSTANCES в одну:

INSTANCES_NEW (word, doc_id)

, где слово теперь VARCHAR(50), а doc_id равно BIGINT

В таблицах INSTANCES и INSTANCES_NEW есть обедва индекса для word_id/word и doc_id.Для тех же данных INSTANCES отображается как занимающий 146 МБ, а INSTANCES_NEW отображается как занимающий 122,7 МБ.Как INT может занять больше места, чем VARCHAR(50)?Почти все слова занимают не менее 3 символов - поэтому теоретически занимаемое место должно быть более чем удвоено.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Трудно, не зная ваших данных, но, вероятно, есть разница в размере ваших индексов.Как вы сказали, у вас есть разные индексы для этих таблиц ... для первой у вас есть индекс для word_id / word, а для второй у вас есть word / doc_id.Таким образом, ваши индексы имеют разное количество записей и, скорее всего, имеют разный размер.Вы можете выполнить SHOW TABLE STATUS , чтобы получить лучшую идею (и, возможно, опубликуйте ее здесь, чтобы мы могли проанализировать ее вместе).

РЕДАКТИРОВАТЬ: Итак, ваши результаты:

экземпляров

Всего строк: 1348741

Средняя длина строки: 40B

Данные: 52,57 МБ

Индекс: 93,20 МБ

Всего: 145,77 МБ

instances_new

Всего строк:1383266

Средняя длина строки: 42B

Данные: 56,57 МБ

Индекс: 66,14 МБ

Всего: 122,71 МБ

и какВы можете видеть, что ваш индекс для таблицы экземпляров (99,2 МБ) значительно больше, чем во втором случае (66,14 МБ), в то время как размер данных почти такой же.Итак, как я и предполагал, разница в размере зависит от размера индекса, тогда как эту небольшую разницу в размере данных можно объяснить небольшой разницей в количестве строк (приблизительно)

1 голос
/ 09 января 2012

int составляет 4 байта, размер varchar зависит от кодировки символов. Если это однобайтовая кодировка, 3-символьное слово занимает всего 3 байта. Эта разница в размерах выглядит примерно так.

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