Столбец таблицы с повторяющимися текстовыми значениями

У меня есть таблица базы данных, в которой есть столбец varchar (200).
Это таблица с исторической информацией журнала, где около 99,9% строк в таблице содержат то же текстовое сообщение, что и другая строка в таблице.
Размер этой базы данных и скорость поиска становятся проблемой.

Итак, я подумал, что могу переместить значения varchar в другую таблицу с уникальными текстовыми значениями, а затем иметь ссылку на эту таблицу для каждой строки в первой таблице, но прежде чем я изменю это, я хотел бы знать, есть ли более простой способ сделать это?
Например, установка некоторого свойства в существующем столбце таблицы, которое автоматически вызовет такое поведение. Так что база данных автоматически поддерживает таблицу с уникальными текстами. Я понимаю, что это, безусловно, сильно повлияет на производительность операции удаления, но в любом случае это почти никогда не делается. Также я бы очень хотел избежать изменения программы, которая вставляет в таблицу журнала.

Я использовал MySQL, но если другая БД может это сделать, это также возможность изменить базу данных на другую. (MariaDB или другой?)

Спасибо


person Kennet    schedule 21.01.2014    source источник
comment
Чего вы здесь хотите добиться - нормализации или увеличения скорости?   -  person divaka    schedule 21.01.2014
comment
Также, если это просто исторический журнал, почему вы в первую очередь регистрируетесь в MySQL?   -  person divaka    schedule 21.01.2014
comment
Моя первая цель - уменьшить размер базы данных. Мне нужно искать в журналах, поэтому я использовал базу данных. В данных также есть метки времени и другие столбцы.   -  person Kennet    schedule 21.01.2014
comment
Почему бы вам просто не составлять отдельные таблицы на ежедневной, еженедельной или ежемесячной основе? Потому что вы уменьшите размер сейчас, а что насчет 3 месяцев? Или 6?   -  person divaka    schedule 21.01.2014


Ответы (2)


Нет никакого свойства или чего-то еще, что бы это делало за вас, но у вас есть хорошая идея, поместив данные varchar в отдельную таблицу. Для этого выполните следующие действия.

  1. Создайте свою таблицу с данными varchar следующим образом:

    CREATE TABLE log_messages (id int auto_increment primary key, message varchar(200)) ENGINE = MyISAM ROW_FORMAT=FIXED;

  2. Вставьте данные varchar

    INSERT INTO log_messages (message) SELECT DISTINCT your_varchar_column FROM your_table;

  3. Добавьте новый столбец в исходную таблицу для ссылки на новую таблицу log_messages

    ALTER TABLE your_table ADD COLUMN message_id int not null;

  4. Создать ссылку

    UPDATE your_table y INNER JOIN log_messages m ON y.your_varchar_column = m.message SET y.message_id = m.id;

  5. Затем вы можете удалить столбец varchar из своей таблицы

    ALTER TABLE your_table DROP COLUMN your_varchar_column;

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

person fancyPants    schedule 21.01.2014

Это правильный способ нормализации, но я советую вместо уникального текста использовать число (целое число) ...

person Anto Raja Prakash    schedule 21.01.2014
comment
Спасибо за ответ. Если бы мне пришлось повторить это заново, я бы сделал то же самое. Я просто хотел убедиться, что не трачу время на то, что база данных могла бы обработать за меня. - person Kennet; 21.01.2014