2014-01-21 4 views
4

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

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

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

Благодаря

+0

Что вы хотите достичь здесь - нормализация или увеличение скорости? – divaka

+0

Также, если это всего лишь исторический журнал, почему вы регистрируетесь в MySQL на первом месте? – divaka

+0

Моя первая цель - уменьшить размер базы данных. Мне нужно искать в журналах, поэтому я использовал базу данных. В данных также есть отметки времени и другие колмуны. – Kennet

ответ

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;

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

1

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

+0

Спасибо за ответ. Если бы мне пришлось это сделать, я бы тоже так поступил. Я просто хотел убедиться, что я не трачу время на то, что база данных может мне помочь. – Kennet

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