Сам Скрипт написан под php 5.4. Переписывать его никто не намерен, а любые вмешательства в конфиги сервера в 9 из 10 случаев приводят к его неработоспособности. Если мягко выражаться, то там полный пи...
К примеру задействовано 3 класса только для работы с БД... не говоря об остальном.
Приходится обходится малой кровью, пока переписывается система с 0.
Я версию Mysql спрашиваю, а не модуля PHP
mysql Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1
Версия MySQL какая?
Просто создание индекса не меняет дело?
Только указывать его принудительно? Это очень редкая ситуация.
В запросе во вложенной секции 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 секунд.
Вот такая картина. И мне она непонятна была пока не наткнулся на указанное выше объяснение. Но факт является фактом - проблема решилась.
В 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 ordersWHERE orders.date ...
Ссылку на данную информацию скиньте, я так понимаю источник зарубежный.
Ближе к вечеру постараюсь найти в истории.
Не имитирует а определяем нужные поля индексов и создает временную таблицу с ними на этапе PREPARE. После СОMPLETE она сразу удаляется. Так как будто бы они были добавлены в саму структуру БД.
Я не особо силен в терминологии, поэтому извините за мой французкий.
Да, например, вот - не инициализированная переменная $start - вместо нее должна быть видимо $from.
Это банальная опечатка, а не рукожопость. И она выдаст только предупреждение, что данной переменной не существует, а не замедляем выполнение до полутора часа...
Вопрос решил сам, ковыряя мануалы... Проблема была в том, что выборка включает в себе вложенные выборки и по каждому WHERE нужны многоколоночные индексы. phpMyadmin их имитирует на этапе PREPARE. А для php нужно указывать самому.
Вот про виртуализацию индексов phpMyadmin а узнал спустя 5 дней гугленья.
это тебе к экстрасенсам нужно ну или гадалке...
зы. единственное объяснение это качество кода, phpMyadmin не рукожопы писали, поэтому он быстрее 😀
<?php$from= microtime(true);$db = new PDO(SETTINGS);$data = $db->query(ЗАПРОС);echo round(microtime(true) - $start, 4);?>
Какая рукожопость в этих 4 строчках кода? Никакой больше обработки - банальная выборка и все.
Банальный "сложный" запрос... код вида:
// Формируем тест выборка$data = $db->query(" SELECT data, (Вложеная выборка вида SELECT),... (Вложеная выборка вида SELECT) FROM table WHERE УСЛОВИЕ LIMIT 10");
Если выставить индексы для всех WHERE (тип данных DITETIME), то запрос выполняется на %% 30 дольше.
LIMIT также замедляет выборку в среднем на %%50. Чистая выборка обрабатывается шустрее.
Возможно в пхпмайадмине указан LIMIT , а в скрипте вытягиваются все сто миллионов записей.
Без примерной структуры и самого запроса, без года скрипта - ничего особо не посоветуешь.
Причем здесь год скрипта - банальная выборка pdo либо mysqli с одним запросом и более ничего.
Даже если ставлю в запросе
... LIMIT ХХХ
Пропорционально запрос выполняется по тому же таймингу.