Лучший способ хранения данных XML в базе данных MySQL с некоторыми конкретными требованиями
Я получаю XML-данные от службы. В тестовых данных, которые я получаю, имеется около 300 XML-узлов, явно слишком много, чтобы создавать отдельные строки в базе данных MySQL.
Проблема в том, что мы в идеале должны хранить все данные, и нам, вероятно, придется ссылаться на данные снова в какой-то момент в будущем - мы не можем просто обработать его один раз и удалить XML-строку.
Каков наилучший способ хранения этих данных в базе данных MySQL?
Я прогнозировал, что с прогнозируемой скоростью в течение нескольких месяцев, если бы мы хранили исходные XML-данные в формате TEXT
, база данных могла вырасти примерно до 500 МБ. В конечном итоге это кажется непрактичным.
Ответы
Ответ 1
Вы можете создать столбец blob
(т.е. mediumtext
). Вместо того, чтобы вставлять XML в виде строк в БД, вы можете закрепить XML, а затем сохранить в MySQL.
Когда вы читаете из MySQL, вы разархивируете его снова. Поскольку XML - это текст, вы получите очень высокие коэффициенты сжатия (около 80% сжатия). Мысленный процесс, диск IO занимает намного больше времени, чем сжатие/не-сжатие, которое в основном связано с процессором.
Недостатком является то, что вы больше не сможете запрашивать или выполнять полнотекстовый поиск с использованием SQL...
Ответ 2
Попробуйте использовать команду LOAD XML. Этот оператор доступен в MySQL 5.5.
Ответ 3
Многое зависит от того, что вы хотите делать с данными - если вы хотите искать материал в XML, то разложить его на дерево даст намного лучшую производительность запросов.
500Mb - это не огромный объем данных - все проблемы связаны с тем, как вы ссылаетесь на него и просматриваете его. Если это просто для архивирования или вам никогда не нужно искать внутри XML, а затем сжимать его (например,), кодирование base64 уменьшит это до менее чем 80 МБ
Ответ 4
Лучший способ - не хранить XML в БД, но у меня есть история с этой конкретной проблемой.
Просто сохраните его как ТЕКСТ. 500 MB ничего для MySql, особенно с типами данных TEXT, поскольку они не хранятся в буфере строк.