Varenik

Рейтинг
85
Регистрация
10.01.2012

Сам Скрипт написан под php 5.4. Переписывать его никто не намерен, а любые вмешательства в конфиги сервера в 9 из 10 случаев приводят к его неработоспособности. Если мягко выражаться, то там полный пи...

К примеру задействовано 3 класса только для работы с БД... не говоря об остальном.

Приходится обходится малой кровью, пока переписывается система с 0.

LEOnidUKG #:

Я версию Mysql спрашиваю, а не модуля PHP

mysql  Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1

LEOnidUKG #:

Версия MySQL какая?

Просто создание индекса не меняет дело? 

Только указывать его принудительно? Это очень редкая ситуация.

mysqlnd 5.0.12-dev - 20150407

В запросе во вложенной секции WHERE до 5 условий. 

ситуация 1: 5 условий, имеются индексы по 1 столбцу - запрос в myadmin выполняется ~5 секунд, скриптом php - около часа.

ситуация 2:  5 условий, имеется группированный индекс по 5 столбцам  - запрос в myadmin выполняется ~3.5-4 секунды, скриптом php - около часа.

ситуация 3:  5 условий, имеется группированный индекс по 5 столбцам с его принудительным указанием (USE INDEX ...)  - запрос в myadmin выполняется ~3.5-4 секунды, скриптом php ~4.5 секунд.

Вот такая картина. И мне она непонятна была пока не наткнулся на указанное выше объяснение. Но факт является фактом - проблема решилась.

LEOnidUKG #:
И что вы в PHP подставляли?

В php ничего. Просто создав многостолбцовый индекс и подкорректировал запрос, указал его приоритетным. Время выполнения стало отличаться на %%5 максимум

USE INDEX (search_current_status_iDx) 
SELECT 
    orders.id,
    ...
    (SELECT current_status FROM ord_status_log USE INDEX (search_current_status_iDx) WHERE ... ORDER BY id DESC LIMIT 1) as status_id
    ...
FROM orders
WHERE orders.date ...
LEOnidUKG #:

Ссылку на данную информацию скиньте, я так понимаю источник зарубежный.

Ближе к вечеру постараюсь найти в истории.

LEOnidUKG #:
Чего-чего phpmyadmin имитирует? 

Не имитирует а определяем нужные поля индексов и создает временную таблицу с ними на этапе PREPARE. После СОMPLETE она сразу удаляется. Так как будто бы они были добавлены в саму структуру БД.

Я не особо силен в терминологии, поэтому извините за мой французкий.

temniy #:

Да, например, вот - не инициализированная переменная $start - вместо нее должна быть видимо $from.  

Это банальная опечатка, а не рукожопость. И она выдаст только предупреждение,  что данной переменной не существует, а не замедляем выполнение до полутора часа...

Вопрос решил сам, ковыряя мануалы... Проблема была в том, что выборка включает в себе вложенные выборки и по каждому WHERE нужны многоколоночные индексы. phpMyadmin их имитирует на этапе PREPARE. А для php нужно указывать самому.

Вот про виртуализацию индексов phpMyadmin а узнал спустя 5 дней гугленья.

totamon #:

это тебе к экстрасенсам нужно ну или гадалке...

зы. единственное объяснение это качество кода,  phpMyadmin  не рукожопы писали, поэтому он быстрее  😀

<?php
$from= microtime(true);
$db = new PDO(SETTINGS);
$data = $db->query(ЗАПРОС);
echo round(microtime(true) - $start, 4);
?>

Какая рукожопость в этих 4 строчках кода? Никакой больше обработки - банальная выборка и все.

Stek #:
Ну раз не при чем, то ищи проблему сам. Как понимаю ты же лучше знаешь :D

Банальный "сложный" запрос... код вида:

// Формируем тест выборка
$data = $db->query("
        SELECT data,
        (Вложеная выборка вида SELECT),
...
        (Вложеная выборка вида SELECT)
        FROM table
        WHERE УСЛОВИЕ
LIMIT 10
");

Если выставить индексы для всех WHERE (тип данных DITETIME), то  запрос выполняется на %% 30 дольше.

LIMIT также замедляет выборку в среднем на %%50. Чистая выборка обрабатывается шустрее.

Stek #:

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

Без примерной структуры и самого запроса, без года скрипта - ничего особо не посоветуешь.

Причем здесь год скрипта - банальная выборка pdo либо mysqli с одним запросом и более ничего.

Даже если ставлю в запросе

... LIMIT ХХХ

Пропорционально запрос выполняется по тому же таймингу.

Всего: 223