@Mixa

Как ускорить процес проверки и записи в базу?

Есть один проект, в котором я парсингом выбираю все посты на странице и записываю в базу, если таковых не обнаружено. Выглядит это примерно так:

// перебираем то, что напарсили
foreach($articles as $item) {

		
	 // тут у нас код в котором, получаем из $item нужные элементы, типа $itemlink
	

        // дальше проверяем наличие в базе по одному из уникальных полей - в данном случае, $itemlink

	 $presql = "select count(*) as allcount from items where link='" . $itemlink . "' ORDER BY 'ID' DESC LIMIT 44";
        $retrieve_data = mysqli_query($conn,$presql);
        $row = mysqli_fetch_array($retrieve_data);
        $count = $row['allcount'];

        if($count == 0){
		  // вставка
		  $sql = "INSERT INTO items (link,)
          VALUES ('$itemlink')";
		  mysqli_query($conn, $sql);


		} else {
          // echo "Уже есть";
        }  

    }


Подозреваю, можно как-то упростить процесс проверки наличия поста в базе, не делая для каждого из 44 запарсенных поста (именно столько их на странице сайта, который парсится) проверку по 44 последним записанным )) Ну и может собственно запись в базу можно делать не для каждого обнаруженного поста, а один раз для всех обнаруженных обновлений, типа собрать в массив и как-то массивом записать за один раз? Или те же яйца?
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
Делайте один SELECT .. WHERE `link` IN (val1, ..., val44).
А в цикле уже этот результат перебирайте.
Вставку новых делайте одним запросом.
INSERT IGNORE или INSERT ... ON DUPLICATE лишним при этом не будут.
Это самый быстрый вариант, у вас будет всего 2 запроса к БД - один на выборку, один на вставку.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@RidgeA
1. Использовать INSERT IGNORE - в таком случае при вставке будут игнорироваться ошибки (в т. ч. совпадения значения уникального поля) и таки строки не будут записаны в БД
2. В одном INSERT делать вставку нескольких записей.
Ответ написан
Stalker_RED
@Stalker_RED
Если поле link уникальное, то можно делать INSERT ... ON DUPLICATE KEY UPDATE.
И конечно никто не мешает вам делать одну вставку вместо сорока четырех.
INSERT INTO items (link, text_content)
VALUES
  ('link1', 'abc'),
  ('link2', 'def'),
  ('link3', 'hello'),
   ...
ON DUPLICATE KEY UPDATE
  link = VALUES(link),
  text_content = VALUES(text_content)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы