Всем привет! Постановка: Необходимо загружать товар из xls файла в БД (MySQL), файл состоит из след полей: Тип товара, Марка, Модель, Название товара, Цена, Уникальный номер со стороны клиента. Получается 6 полей Таблица goods БД будет состоять из след. полей: id, mark, model, name, price, idx, visible, update где id-уникальный номер в БД, (index) tip-Тип товара, (index) mark-Марка, (index) modelМодель, (index) name-Название товара, price-Цена, idx-Уникальный номер со стороны клиента, (index) visible-видимость для всех пользователей, (index) update-признак обновлена строка или нет (index) Поля марка и модель это id из таблиц marka и model. Для разбора xls файла нашел в инете парсер. Разбираю товар след. образом: 1. update-ом возвожу переменную update и visible в ноль. 2. Сравниваю поля марка и модель с таблицей marka и model, идет сравнение текстового поля, если совпадает извлекаю id и вставляю в табл. goods. 3. slect-ом проверяю есть ли в табл. goods данная позиция, путем сравнения поля idx с полем из файла "Уникальный номер со стороны клиента". 4. select-ом проверяю в базе записи на повтор поля idx, т.к. эти поля должны быть уникальны для данного продовца, но не уникальными в пределах всей таблицы. 5. Если пункт 3 true то делаю update табл. goods и обновляю все поля, причем поля update и visible возвожу в 1. 6. Если пункт 3 fals тогда делаю insert. 7. Если пункт выдает true, то сообщаю что есть дубликат и запись остаётся неизменной, о чем выводится ошибка. Вобщем прежде чем записать или обновить строку я делаю 5 запросов, не считая одного перед циклом (пункт 1) им можно принеберчь. Естественно таким образом я сильно нагружаю БД и максимум записать получается 1500 позиций, а их может быть несколько 10-ов тысяч. Еще Обращаю внимание, что парсер xls тоже затягивает 1процесс. Как мне ускорить время загрузки товара? Если сделать поля mark и model не (index), а внешними ключами, ускорю процесс? Интересно послушать мнение кто сталкивался с такой проблемой.
Несколько сумбурно все описано. Не всегда понятно откуда и какие данные с чем сравниваются и зачем. Как стоит делать обновление. 1. залить все данные из файла во временную таблицу в один присест. 2. извлечь id записей которых нет в принципе и перенести из временной таблицы в основную (вроде как можно помучатся и сделать это одним запросом). 3. Сделать нужные проверки для остальных (тоже 1-2 запроса на все записи сразу) 4. выполнить апдейты (вот тут не помню, скорее всего 1 запрос на каждую запись, но можно помедитировать над INSERT ON DUPLICATE KEY UPDATE) Для записей уникальных для продавца - сделать сурогатный уникальный ключ вида (idsaler, idx), где idsaler - продавец, а idx - тоже что и у Вас. Тогда проверку целостности будет делать сама БД. Для полей "марка" и "модель" непонятно какие данные сравниваются (то ли из БД, то ли из xls) и соответственно нужен ли вообще внешний ключ - неясно. (но смена index на foreign key ничего не ускорит ) Итого число запросов от N+4 до 3*N + 4, где N число строк записей в xls
Пытаюсь сделать след. Код (Text): include "../lib/mysql/mysql.php"; require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname); if($rm=$db->sql_query("CREATE TEMPORARY TABLE temp (tip int(4) NOT NULL, mark varchar(255), INDEX (tip), INDEX (mark))")) echo"Таблица созданна<br>"; else echo"Таблица не созданна<br>"; if($rm=$db->sql_query("insert into temp (tip, mark) values ('1','mark')")) echo"Данные добавленны<br>"; else echo"Данные не добавленны<br>"; выдает Таблица не созданна Данные не добавленны использую mysql класс где: $this->db_connect_id = mysql_connect($this->server, $this->user, $this->password) Почему не создается таблица? пробую ч/з phpmyadmin запрос выполняется успешно
Нет у меня пользователя, к этому файлу у меня все подцепленно: Код (Text): require_once($_SERVER['DOCUMENT_ROOT'].'/config.php'); И все работает Если вот так сделать Код (Text): $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname); echo mysql_errno() . ": " . mysql_error() . "<br>"; то ошибки нет а чуть ниже Код (Text): if($rm=$db->sql_query("CREATE TEMPORARY TABLE temp (tip int(4) NOT NULL, mark varchar(255), INDEX (tip), INDEX (mark))")) echo"Таблица созданна<br>"; else { echo"Таблица не созданна<br>"; echo mysql_errno() . ": " . mysql_error() . "<br>"; } ошибку выдает
И чем я могу помочь? Возможно отсутствующий пользователь не имеет прав на создание таблиц. Рекомендую все же использовать с именем пользователя.