Как запустить несколько SQL запросов с использованием PHP без нагрузки на сервер MySQL? - PullRequest
0 голосов
/ 02 марта 2012

У меня есть скрипт, который читает лист Excel, содержащий список продуктов.Это почти 10000 товаров.Сценарий читает эти продукты и сравнивает их с продуктами в базе данных mysql и проверяет

  • , если продукта нет в наличии, тогда ДОБАВЬТЕ ЭТО (поэтому я добавил для этого запрос на вставку)1005 *

  • если продукт уже доступен, ОБНОВИТЬ ЭТО (поэтому я поставил запрос на обновление для этого)

Теперь проблема в том, что он создаеточень тяжелая нагрузка на сервер MySQL, и он показывает сообщение как «сервер MySQL пропал ..».

Я хочу знать, есть ли лучший способ сделать эту работу с Excel листом без нагрузки на сервер MySQL?

Ответы [ 4 ]

0 голосов
/ 02 марта 2012

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

Данные кэша, о которых вы знаете, уже существуют, поэтому, если переменные продуктов не изменяются регулярно, вам, возможно, не придется проверять их так часто. Вы можете кэшировать данные для быстрого поиска / изменения позже (см. Memcached, доступны другие альтернативы кэширования). В итоге вы можете значительно снизить рабочую нагрузку.

Вы разделили свой сервер MySQL? Попробуйте запустить проверку продукта в другой подсистеме и объединить базы данных с вашей основной, почасовой или ежедневной или любой другой.

0 голосов
/ 02 марта 2012

Я не уверен, почему PHP вошел в микс.Excel может подключиться напрямую к базе данных MySql, и вы сможете выполнить запрос WHERE NOT IN, чтобы добавить элементы и операторы UPDATE для дополнений, которые изменились с помощью Excel VBA.

http://helpdeskgeek.com/office-tips/excel-to-mysql/

0 голосов
/ 02 марта 2012

Хорошо, вот быстрое решение

Вместо выполнения запроса, после каждой проверки, где он присутствует или нет, добавляйте в свой sql, пока вы достигнете конца, а затем, наконец, выполните его.

Пример

$query = ""; //creat a query container
if($present) {
    $query .= "UPDATE ....;"; //Remember the delimeter ";" symbol
} else {
    $query .= "INSERT ....;";
}
//Now, finally run it
$result = mysql_query($query);

Теперь вы делаете один запрос в последней части.


Обновление: подходите к этому по-другому

Используйтезапрос для его обработки.

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

Ссылка

0 голосов
/ 02 марта 2012

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

Кроме того, хорошим вариантом оптимизации было бы введение индексов в MySQL, которые значительно ускорили бы поиск товаров, введение индекса для тех столбцов таблицы товаров, на которые вы чаще всего ссылаетесь в своей функции поиска php.

Кроме того, вы можете увеличить размер буфера MySQL до 256 МБ, чтобы кэшировать большую часть результатов, а также использовать InnoDB, чтобы вам не нужно было блокировать всю таблицу каждый раз, когда вы выполняете проверку, а также ввод функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...