Перенести данные из файла в базу данных

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Перенести данные из файла в базу данных

Сообщение TM123 »

Я уже говорил о том, что никого не заставляю использовать мои советы, каждый волен решать сам что ему лучше.

Напоследок в эту тему скажу

1. Добавить/удалить/изменить пару полей во временной таблице гораздо проще чем переписывать кусок кода в PHP, ну это так чисто мое мнение.
2. Я не буду делать 20000 запросов чтобы выяснить что 2000 не изменилось, я просто сделаю update всех 20000 записей и мне все равно кто обновился, а кто нет. Что страшного случится в том, что вы обновите запись в которой данные не изменились? Те кто обновился будут обновлены, те кто не обновился будут тоже обновлены с точки зрения базы, но останутся неизменными с точки зрения содержащихся в них данных. Часто бывает проще и выполнится быстрее тупо сделать 2000 лишних обновлений, чем накручивать мегаалгоритмы разбирательства что там изменилось, а что нет. Если говорить о MySQL, он не поддерживает join в update, поэтому эта задача решается путем удаления всех записей по pkey, которые есть во временной таблице и вставка нового набора измененных записей. Если на боевой таблице имеются внешние ключи от других таблиц, то на время выполнения обновления можно внешние ключи отключить/удалить, а потом включить/создать.

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

Приведу один занимательный пример.
Как-то контора в которой я работал заказала разработку системы распределения прав взамен существующей. Делали эту систему люди которых я лично знаю и имею весьма высокое мнение о их профессиональных навыках, местами эти навыки я оцениваю выше чем у меня.
Приехали они сдавать, запустили вычисление прав на базе в 200 метров и нам просто надоело ждать через 45 минут данного вычисления, а таких запросов боевой сервер должен выполнять несколько сотен в минуту. Боевая база 2 GB + 200MB в месяц, у боевого сервера в 2 раза больше ядер и памяти чем у разработческого. Обсудили варианты, мои оппоненты были за кэширование - логичное но не всегда правильное решение, я за генерацию SQL запросов на лету, которые не используют книжную теорию вычисления прав исходя из принципа что для того, чтобы определить набор к которому есть доступ, нужно вычислить права ко всему набору и отдать только те к кому доступ есть. Через 40 минут программинга их код смог отработаться за 8 минут, мой пилот за 12 миллисекунд, люди были просто в полном ауте, они просто не могли представить что эту задачу можно решать не стандартными методами, как говорится как по книжке и математически "правильно". После того как они подпилили мой пилот, он стал работать 2 миллисекунды на боевой базе.

Кстати судя по логам фреймворка, система вычисления прав пользователей использует последовательны обход дерева AuthItemChild - пример не эффективности и использования методов как по книжке, проще использовать метод последовательного приближения, с помощью которого делается столько SQL запросов, сколько максимальная глубина дерева для данной последовательности, в рекурсивном методе используется столько SQL запросов, сколько узлов в дереве. Кто хочет может завести отдельную ветку для этого.

Мне вообще не хочется вести holywar'ы тут или где еще либо, я высказываю свое мнение и заметьте никогда его не навязываю, если возникают оппоненты по делу, то принимаю участие в дискуссии, вдруг я заблуждаюсь, но доказывать из принципа я не собираюсь.
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Перенести данные из файла в базу данных

Сообщение esche »

TM123 писал(а):Я уже говорил о том, что никого не заставляю использовать мои советы, каждый волен решать сам что ему лучше.
...
Мне вообще не хочется вести holywar'ы тут или где еще либо, я высказываю свое мнение и заметьте никогда его не навязываю, если возникают оппоненты по делу, то принимаю участие в дискуссии, вдруг я заблуждаюсь, но доказывать из принципа я не собираюсь.
Вы предложили хороший метод, точнее направление (я ведь и правда полез в мануалах команду import искать после такого... "выполнить SQL команду import".. ). Однако, он не всегда пригоден (это стоило озвучить) и не всегда лучше. И слегка приукрасили (формат импорта ведь не известен.. да и про валидацию ни слова) И форма подачи не совсем корректная (так же как и в случае с помойкой AR). А самое главное (не только в этой теме.. вообще) - многие высказывания в корне неверны (не в смысле "моё мнение", а в смысле технических возможностей БД/работы PHP, фреймворка, протоколов) и местами полная уверенность в своей правоте.
И даже в последнем сообщении
Если говорить о MySQL, он не поддерживает join в update...
Откуда инфа? У меня работает, блин...

Ни в коей мере не хочу ни оспаривать, ни преуменьшать Ваших заслуг, опыта и профессионализма, однако не понимаю, зачем давать неверную инфу? Ещё и с претензиями, мол "чё тут непонятного"... Само по себе желание правильно ответить - хорошее.. Просто донесите свою мысль до вопрошающего - Вам будут благодарны... Возможно, всё это заблуждения..

Прошу прощенья у ТС-а и у пользователей за разведённый... срач
...
Аватара пользователя
BuCeFaL
Сообщения: 447
Зарегистрирован: 2010.03.17, 21:22
Откуда: Kiev
Контактная информация:

Re: Перенести данные из файла в базу данных

Сообщение BuCeFaL »

я бы генерировал дамп через mysqldump и импортировал файл через mysql в backgroud. Тесть кто то там заливает файл PHP переносит файл в нужное мест и сторонняя тулза (демон, крон, воркер или что там еще) импортит файл с заданного пути.
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

Re: Перенести данные из файла в базу данных

Сообщение TM123 »

Из той же самой документации
Multiple-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
Да не заметил, бывает.

AR не люблю и являюсь идеологическим ее противником, особенно объектно-ориентированной ее реализацией от того так резок в суждениях о ней, потому что видел как не один мой проект умер после моего ухода из него и внедрения "прогрессивных" технологий в основном AR. AR - это надругательство над потреблением памяти и скоростью работы ПО как на стороне сервера приложений так и базы данных и сетью в целом. Зачем она была сделана уже писал, на небольших проектах типа пара страниц даже ничего, но пихать ее везде - это тоже самое что использовать везде ООП. Пользуюсь ли AR, да пользуюсь, потому что вынужден это делать, т.к. используемые средства построены на ее основе, а собственный фреймворк не могу написать уже года 3-4, то времени не хватает, то прихожу к выводу что можно сделать лучше и начинаю переписывать все.

Приведу реальный пример. База 2.5GB сервер базы данных XEON 3.2GH 4 ядра 16GB оперативки SCSI RAID 5 из 5 дисков 10000fpm + сервер приложений XEON 3.0 GH 4 ядра 4GB оперативки SCSI RAID черезстрочник из 2 дисков 10000fpm связанные 100Mb сетью обслуживают 240 сотрудников компании являясь основным средством автоматизации и интеграции 1С и банк-клиента, а так же 1800 клиентов компании - справочный интерфейс. Отдача страниц 1-5 сек, кроме отчетов, они до 5 минут, в основном 20-30 сек. После моего ухода из проекта, стали внедрять "правильные" технологии, в результате на базе в 300MB сервер базы данных 2 сервера в кластере по XEON 3.5 GH 64 ядра 128GB оперативки SAS RAID черезстрочное зеркало из 32 дисков 15000fpm + сервер приложений в кластере из 2 серверов по XEON 3.0 GH 32 ядра 64GB оперативки SATA RAID черезстрочное зеркало из 16 дисков 10000fpm связанные 2*1Gb сетью обслуживали 40 сотрудников компании и 15 клиентов в том же объеме что и ранее, правда отдача страниц от 5 секунд, а построение практически всех отчетов от 10 минут и это при условии того, что они включили кэширование с выделенным кэшсервером, а не только кэш базы данных и дисковой подсистемы. AR просто изнасиловала память и процессор запросами на выделение памяти под ненужные данные, а так же переборами массивов данных с типом данных VARIANT, постобработка данных на стороне сервера приложений с использованием AR тоже не дала скорости. Когда я планировал это железо к закупке, я рассчитывал что его хватит на 2-3 года и базу не менее 10 GB, 2 раза больше сотрудников и 10 раз больше клиентов, реально же проект даже не смог стартовать в своем обновленном виде.

Это самый вопиющий случай из моих проектов и в общем-то самый первый из тех кого пытались перевести на AR. Потом были и другие проекты и реализация AR с тех пор улучшилась, но результат неизменно один и тот же, только не так плачевен. После такого как-то трудно становится верить в человечество :)
Ответить