• Как ускорить запрос SELECT который выводит цену в диапазоне дат?

    @arsenaljek Автор вопроса
    AUser0,
    "id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra"
    "1" "SIMPLE" "prices" "ALL" "id_product" \N \N \N "12975903" "Using where; Using filesort"
  • Как ускорить запрос SELECT который выводит цену в диапазоне дат?

    @arsenaljek Автор вопроса
    SELECT  `date`, `date` - INTERVAL 1 DAY AS `prevDate`, `price_product` FROM `prices` FORCE INDEX (`id_product`) WHERE `id_product` = 235408123  ORDER BY `date`;

    /* Affected rows: 0 Найденные строки: 19 Предупреждения: 0 Длительность 1 query: 11,279 sec. */
    SELECT  `date`, `date` - INTERVAL 1 DAY AS `prevDate`, `price_product` FROM `prices` USE INDEX (`id_product`) WHERE `id_product` = 235408123  ORDER BY `date`;

    /* Affected rows: 0 Найденные строки: 19 Предупреждения: 0 Длительность 1 query: 12,449 sec. */
  • Как ускорить запрос SELECT который выводит цену в диапазоне дат?

    @arsenaljek Автор вопроса
    Дмитрий, пробовал ключ на дату только, стало еще медленнее.
  • Как ускорить запрос SELECT который выводит цену в диапазоне дат?

    @arsenaljek Автор вопроса
    Дмитрий, Спасибо за подсказку. Поправил, но запрос по прежнему очень долгий(
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Попробовал. Визуально все осталось так же. Вообще в Mysql Запрос занял 0.0006 сек. Но сама страница стала намного дольше грузиться( Если отключаешь этот запрос, то скорость загрузки страницы заметно вырастает...
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97,
    ВОТ EXPLAIN
    id select_type table partitions type possible_keys key key_len ref rows filtered Extra
    1 SIMPLE prices NULL ref id_product id_product 302 const 20 100.00 Using index condition; Using filesort

    Таблица prices ~ 10 млн записей
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, А есть ли возможность ускорить запрос?
    $sql = "SELECT DATE_FORMAT(date,'%d.%m.%Y') as date1, `date`, `date` - INTERVAL 1 DAY AS `prevDate`, `price_product` FROM `prices` WHERE `id_product` = ".$row_product['id_product']." ORDER BY `date`";

    Время загрузки страницы достаточно увеличилось с появлением этого запроса. Индекс на id_product стоит.
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Точно. Я забыл. Я хотел таким способом поменять порядок выдачи, чтобы от текущей даты вывод был
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Вроде все вверно "скопипастил"
    $sql = "SELECT `date`, `date` - INTERVAL 1 DAY AS `prevDate`, `price_product` FROM `prices` WHERE `id_product` = ".$row_product['id_product']." ORDER BY `date` DESC";
    $result = mysqli_query($link6,$sql);
    $row1 = [];
    while ($row2 = mysqli_fetch_assoc($result)) { 
     if (count($row1)) {
        echo $row1['date'] . ' - ' . $row2['prevDate'] . ' - ' . $row1['price_product'] . "<br>";
    }
      $row1 = $row2;
    }
    if (count($row1)) {
      echo $row1['date'] . ' - ' . date('Y-m-d') . ' - ' . $row1['price_product'] . "<br>";
    }

    Вот, что выводит данный код
    5ccf9886b77ef354551831.jpeg
    А вот, как цены этого товара лежат в базе
    5ccf98a3ccf92984607124.jpeg
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Поспешил...Ваш запрос мне вернул такой вот результат
    "date" "prevDate" "price_product"
    "2019-02-15" "2019-02-14" "1118"
    "2019-03-15" "2019-03-14" "1200"
    "2019-04-30" "2019-04-29" "1800"
    Но должно быть немного не так, а тк
    "2019-02-15" - "2019-03-14" - "1118"
    "2019-03-15 - "2019-04-29" - "1200"
    "2019-04-30" - "2019-04-30" - "1800"
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Большое спасибо. Второй раз мне уже помогаете!) Всё получилось
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    dass45, в том то и дело, что цена может повториться
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Rsa97, Условие выполняется. Я могу вывести, как описанный выше массив, так и то, что есть в базе
    (
    [30.04.2019] => 1800
    [15.03.2019] => 1200
    [15.02.2019] => 1118
    )
    Массив я вывожу так
    foreach($result as $article2) {
    if (isset($article1['price_product'])) {
    $articles1[date("d.m.Y",strtotime($article2['dtp']))] = (int)$article2['price_product'];
    }
    }
    Запрос мой выводит данные такого типа
    "dtc" "id_product" "description" "image_product" "name" "price_product" "dtp"
    "2019-02-17" "1111111" "Описание" "1111111.jpg" "Фитнес-браслет Xiaomi Mi Band 2, Black" "1118" "2019-02-15"
    "2019-02-16" "2222222" "Описание" "2222222.jpg" "Фитнес-браслет Xiaomi Mi Band 2, Black" "1118" "2019-02-15"
    "2019-02-15" "3333333" "Описание" "3333333.jpg" "Фитнес-браслет Xiaomi Mi Band 2, Black" "1118" "2019-02-15"
    dtc - это сгененированные дни
    dtp - это та уникальная запись ценой из таблицы цен.
  • В диапазоне дат оставить уникальные значения цен?

    @arsenaljek Автор вопроса
    Пытаюсь осмыслить, то что вы написали...
    А возможно ли решить данную проблему в рамках одного запроса?
    Мой запрос выводит массив такого вида
    (
    [30.04.2019] => 1800
    [29.04.2019] => 1200
    [28.04.2019] => 1200
    [27.04.2019] => 1200
    [26.04.2019] => 1200
    [25.04.2019] => 1200
    [24.04.2019] => 1200
    [23.04.2019] => 1200
    [22.04.2019] => 1200
    [21.04.2019] => 1200
    [20.04.2019] => 1200
    [19.04.2019] => 1200
    [18.04.2019] => 1200
    [17.04.2019] => 1200
    [16.04.2019] => 1200
    [15.04.2019] => 1200
    [14.04.2019] => 1200
    [13.04.2019] => 1200
    [12.04.2019] => 1200
    [11.04.2019] => 1200
    [10.04.2019] => 1200
    [09.04.2019] => 1200
    [08.04.2019] => 1200
    [07.04.2019] => 1200
    [06.04.2019] => 1200
    [05.04.2019] => 1200
    [04.04.2019] => 1200
    [03.04.2019] => 1200
    [02.04.2019] => 1200
    [01.04.2019] => 1200
    [31.03.2019] => 1200
    [30.03.2019] => 1200
    [29.03.2019] => 1200
    [28.03.2019] => 1200
    [27.03.2019] => 1200
    [26.03.2019] => 1200
    [25.03.2019] => 1200
    [24.03.2019] => 1200
    [23.03.2019] => 1200
    [22.03.2019] => 1200
    [21.03.2019] => 1200
    [20.03.2019] => 1200
    [19.03.2019] => 1200
    [18.03.2019] => 1200
    [17.03.2019] => 1200
    [16.03.2019] => 1200
    [15.03.2019] => 1200
    [14.03.2019] => 1118
    [13.03.2019] => 1118
    [12.03.2019] => 1118
    [11.03.2019] => 1118
    [10.03.2019] => 1118
    [09.03.2019] => 1118
    [08.03.2019] => 1118
    [07.03.2019] => 1118
    [06.03.2019] => 1118
    [05.03.2019] => 1118
    [04.03.2019] => 1118
    [03.03.2019] => 1118
    [02.03.2019] => 1118
    [01.03.2019] => 1118
    [28.02.2019] => 1118
    [27.02.2019] => 1118
    [26.02.2019] => 1118
    [25.02.2019] => 1118
    [24.02.2019] => 1118
    [23.02.2019] => 1118
    [22.02.2019] => 1118
    [21.02.2019] => 1118
    [20.02.2019] => 1118
    [19.02.2019] => 1118
    [18.02.2019] => 1118
    [17.02.2019] => 1118
    [16.02.2019] => 1118
    [15.02.2019] => 1118
    )
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Спасибо, Вам за помощь. Всё работает!
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Мммм..
    Т.е теперь у нас становиться 2 триггера.
    Триггер Update
    DELIMITER $$
    CREATE TRIGGER `update_price` before update ON `products`
    FOR EACH ROW BEGIN
    IF NEW.`price` != OLD.`price` THEN
      INSERT INTO prices Set id_products = OLD.id_products  , price_product = OLD.price, `date` = OLD.`date`;
    END IF;
    END;
    $$
    DELIMITER ;

    И добавляем триггер insert
    DELIMITER $$
    CREATE TRIGGER `insert_price` AFTER INSERT ON `products`
    FOR EACH ROW BEGIN
    IF NEW.`price` != NEW.`price` THEN
      INSERT INTO prices Set id_products = NEW.id_products  , price_product = NEW.price, `date` = NEW.`date`;
    END IF;
    END;
    $$
    DELIMITER ;
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Всё работает. Спасибо за подсказку и направление в изучении темы триггеров!)
    Единственно, что если обе таблицы пустые, то при первом срабатывании скрипта, он не пишет цены в таблицу prices. С этим можно что-то придумать?
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Я правильно понимаю?
    DELIMITER $$
    CREATE TRIGGER `update_price` before update ON `products`
    FOR EACH ROW BEGIN
    IF NEW.`price` != OLD.`price` THEN
      INSERT INTO prices Set id_products = OLD.id_products  , price_product = OLD.price, `date` = OLD.`date`;
    END IF;
    END;
    $$
    DELIMITER ;
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Запустил скрипт. В таблицу products было добавлено около 600 000 товаров. В таблицу цены 60 000...
    Встроил Ваш код в свой, получилось так
    while ($z->read() && $z->name !== 'offer');
      $data = [];
      while ($z->name === 'offer') {
        //$node = new SimpleXMLElement($z->readOuterXML());
        $node = simplexml_import_dom($doc->importNode($z->expand(), true));
        $id_product = mysqli_real_escape_string($link6,$node['id']);
        $url = mysqli_real_escape_string($link6,$node->url);
        $price = $node->price;
        $group = $node->categoryId;
        $image = mysqli_real_escape_string($link6,$node->picture);
        $name = mysqli_real_escape_string($link6,$node->name);
        $vendor = mysqli_real_escape_string($link6,$node->vendor);
        $vendorCode = mysqli_real_escape_string($link6,$node->vendorCode);
        $description = mysqli_real_escape_string($link6,$node->description);
        $barcode = mysqli_real_escape_string($link6,$node->barcode);
        $data[] = '("'.$id_product.'","'.$vendorCode.'","'.$vendor.'","'.$barcode.'","'.$name.'","'.$description.'","'.$image.'","'.htmlspecialchars(urldecode($url)).'","'.$group.'","'.$today.'",'.(int)$price.')';
        if (count($data) > 99) {
          $sql = 'INSERT INTO `products` (`id_product`,`vendorCode`,`vendor`,`barcode`,`name`,`description`,`image_product`,`link_product`,`group`,`date`,`price`) VALUES ' 
             . implode(',', $data)
             . 'ON DUPLICATE KEY UPDATE `link_product` = VALUES(`link_product`), `price` = VALUES(`price`)';
          echo $sql.'</br>';
          mysqli_query($link6,$sql);
          $data = [];
        }
        $z->next('offer');
      }
      if (count($data) > 0) {
        $sql = 'INSERT INTO `products` (`id_product`,`vendorCode`,`vendor`,`barcode`,`name`,`description`,`image_product`,`link_product`,`group`,`date`,`price`) VALUES ' 
           . implode(',', $data)
           . 'ON DUPLICATE KEY UPDATE `link_product` = VALUES(`link_product`), `price` = VALUES(`price`)';
        mysqli_query($link6,$sql);
      }
    }

    Триггер добавил так
    DELIMITER $$
    CREATE TRIGGER `update_price` before update ON `products`
    FOR EACH ROW BEGIN
      INSERT INTO prices Set id_products = OLD.id_products , price_product = OLD.price, `date` = OLD.`date`;
    END;
    $$
    DELIMITER ;
  • Запись больших xml в MYSQL?

    @arsenaljek Автор вопроса
    Rsa97, Первый раз с этим сталкиваюсь...
    Пытаюсь выполнить
    CREATE TRIGGER `update_price` before update ON `products`
    FOR EACH ROW BEGIN
      INSERT INTO prices Set id_products = OLD.id_products , price_product = OLD.price;
    END;

    Говорит, что синтаксическая ошибка.
    Поле id_products находится в обоих таблицах (products и prices) и в нем содержится артикул товара