Лучший способ хранения данных 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, поскольку они не хранятся в буфере строк.