В прошлый раз я рассказывал как решить такую задачу в Oracle, теперь расскажу как можно результат запроса выгрузить в файл средствами MySQL.
И так, у нас есть MySQL и большой объем данных. Скажу сразу, что раньше эту задачу я решал средствами PHP и Apache, мой объем данных выгружался за 12 - 18 часов. Теперь, только средствами MySQL, на это уходит несколько секунд (я был поражен).
И так, начнем. Что бы выгрузить файл необходимо в запросе указать INTO OUTFILE 'имя_файла'
SELECT field_a, field_b FROM foo INTO OUTFILE '/tmp/from_mysql/result_example_1';
Сразу замечу, к каталогу /tmp/from_mysql
необходим доступ для записи пользователя от имени которого запущен MySQL.
Теперь нужно сформировать данные в формате XML. Для этого мы используем функцию CONCAT() для объединения строк:
SELECT CONCAT( "\n\t<a>", field_a, "</a>\n", "\t<b>", field_b, "</b>\n") FROM foo INTO OUTFILE '/tmp/from_mysql/result_example_2';
Объединять поля можно и в CONCAT(), но лучше воспользоваться более правильными средствами MySQL:
SELECT CONCAT( "\n\t<a>", field_a, "</a>\n", "\t<b>", field_b, "</b>\n") FROM foo INTO OUTFILE '/tmp/from_mysql/result_example_3' LINES STARTING BY '\t\t<foo>' TERMINATED BY "\t\t</foo>\n";
И еще пару строчек, что бы в наших данных не было лишних слешей экранирующих различные символы (например пробелы):
SELECT CONCAT( "\n\t<a>", field_a, "</a>\n", "\t<b>", field_b, "</b>\n") FROM foo INTO OUTFILE '/tmp/from_mysql/result_example_4' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY ' ' ESCAPED BY '' LINES STARTING BY '\t\t<foo>' TERMINATED BY "\t\t</foo>\n";
Вот собственно и все.
Автор: Сергей Степанов
Поделиться @