Сжатие текста URL (не сокращение) и сохранение в MySQL - PullRequest
3 голосов
/ 12 сентября 2011

У меня есть таблица URL в MySQL, которая имеет только два поля id и varchar (255) для URL.В настоящее время там находится более 50 миллионов URL-адресов, и мой начальник только что дал мне подсказку о расширении нашего текущего проекта, что приведет к добавлению дополнительных URL-адресов в эту таблицу URL-адресов, и ожидаемые цифры в середине 150-х годов составят примерно 150 миллионов.в следующем году.

В настоящее время размер базы данных составляет около 6 ГБ, поэтому я могу с уверенностью сказать, что если все оставить без изменений, то она превысит 20 ГБ, что не очень хорошо.Итак, я думаю о каком-то решении, которое может уменьшить дисковое пространство для хранения URL.

Я также хочу прояснить, что эта таблица не занята и что в данный момент не слишком много запросов, поэтому я просто хочу сэкономить место на диске и, что более важно, я ищу новые идеисжатого короткого текста и его хранения в mysql

НО в будущем к этой таблице также можно будет получить большой доступ, так что лучше оптимизировать таблицу задолго до наступления времени.

Я немного потрудился, чтобыизмените URL в числовую форму и сохраните, используя BIGINT, но поскольку он имеет ограничения в 64 бита, поэтому он не сработал достаточно хорошо.То же самое относится и к типу данных BIT, который также накладывает ограничение в 64 бита.

Моя идея преобразования в числовую форму заключается в том, что 8-байтовый BIGINT хранит 19 цифр, поэтому, если каждая цифра указывает символ в наборе символовиз всех возможных символов он может хранить 19 символов в 8 байтах, если все символы находятся в диапазоне от 1 до 10, но, как и в сценарии реального мира, есть 52 символа английского языка и 10 числовых плюс несколько символов, так что его около 100 символов.Таким образом, в худшем случае BIGINT все еще может указывать на 6 символов, и да, это не окончательный вердикт, ему все еще нужно потренироваться, чтобы точно знать, на что указывает каждая цифра, это 10+ цифр или 30+ цифр или 80+ цифр, но у вас естьПонял, о чем я думаю.

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

Я также рассмотрел некоторые алгоритмы сжатия текста, такие как алгоритмы сжатия smaz и Huffman, но не очень убедительно, потому что они используют какие-то словарные слова, но я ищу чистый метод.

И я не хочу использовать двоичный тип данных, потому что он также занимает слишком много места, как varchars в байтах.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

Еще одна идея, которую можно попробовать, - определить общие строки и представить их с помощью растрового изображения. Например, иметь два бита для представления протокола (http, https, ftp или что-то еще), еще один бит, чтобы указать, начинается ли домен с «wwww», два бита, чтобы указать, заканчивается ли домен «.com», «. org "," .edu "или что-то еще. Вам нужно будет провести некоторый анализ ваших данных и посмотреть, имеют ли они смысл, и есть ли какие-либо другие общие строки, которые вы можете идентифицировать.

Если у вас много URL-адресов на один и тот же сайт, вы также можете рассмотреть возможность разделения таблицы на две разные, одна из которых содержит домен, а другая содержит относительный к домену путь (а также строку запроса и идентификатор фрагмента, если они есть). ). У вас будет таблица ссылок с идентификатором URL-адреса, идентификатором домена и идентификатором пути, и вы замените исходную таблицу URL-адресов представлением, объединяющим три таблицы. Таблица доменов не должна быть ограничена доменом, вы можете включить столько URL, сколько было распространено (например, 'http://stackoverflow.com/questions'). Это не потребовало бы слишком много кода для реализации, и его преимущество по-прежнему было удобочитаемо. Ваша числовая кодировка может быть более эффективной, как только вы ее выясните, вам придется анализировать свои данные, чтобы понять, какие из них более целесообразны.

2 голосов
/ 13 сентября 2011

Если вы ищете 128-битные целые числа, тогда вы можете использовать двоичный код (16), здесь 16 - байты.И вы можете расширить его до 64 байт (512 бит), чтобы он не занимал больше места, чем битовый тип данных.Вы можете назвать двоичный тип данных как расширение типа данных BIT, но его строковый вариант.

Сказав, что я бы предложил словарные алгоритмы для сжатия URL-адресов и коротких строк, но с сочетанием методов, используемых такими службами сокращения URL, какиспользуя AZ az 0-9 комбинацию из трех слов для замены больших словарных слов, и у вас будет больше доступных комбинаций, чем доступных слов 62 X 62 X 62.

Хотя я не уверен, какой уровень сжатия вы бы достигли, нонеплохая идея реализовать сжатие URL таким способом.

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