Помогите оптимизировать mysql запрос


FrancisDarroze
516

Всем привет! Очень сильно нагружается процессор и достаточно медленно выполняется запрос:

Обе таблицы достаточно большие: особенно TaskFlow, как можно решить вопрос?

 $sql = "

SELECT
task.id,
task.cost,
task.provider,
task.last_start_dt
FROM Task task
LEFT JOIN TaskFlow flow ON flow.url_id=task.url_id AND flow.user_id = %i
WHERE task.status="active"
";
if ($tip) {
$sql .= "AND task.type = %s";
}
$sql .= " AND task.last_start_dt < '" . date('Y-m-d H:i:s', strtotime('-' . $this->insta_start_delay . ' second', time())) . "'";
$sql .= " AND flow.dt_accepted IS NULL";

$tasks_all = DB::query($sql, $this->user->id_get(), $tip);
if (!$tasks_all) {
return false;
}


LEOnidUKG

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

JOIN больших таблиц это ещё то удовольствие.


Sitealert
FrancisDarroze:
AND flow.user_id = %i

Убери это из JOIN и вставь в WHERE.


livetv

Получите текст запроса и выполните его EXPLAIN


FrancisDarroze
Sitealert:
Убери это из JOIN и вставь в WHERE.

Ни на что не повлияло


Sitealert
FrancisDarroze:
Ни на что не повлияло

Зато стало по феншую. А в самом запросе больше нечего оптимизировать, только сделать то, что выше предложили.


ArbNet

А мне интересно стало «DB::query» у вас объект базы данных присвоен PHP константе? по типу: define(‘DB’,DataBase::Instance());


Sitealert

ArbNet, удали то, что написал, пока никто не увидел. 😉


Aisamiery
ArbNet:
А мне интересно стало «DB::query» у вас объект базы данных присвоен PHP константе? по типу: define(‘DB’,DataBase::Instance());

Ну как так то? Ну блин?

Я так надеялся что вы хотя бы смогли освоить php более менее, фиг с ним что не хватило мозгов на освоение готовых либ, но язык то язык?

PS Это статический метод класса. Какой же у вас уровень интересно?

PPS. Константами могут быть только скалярные типы и массив (с 5.6)

PPPS Обратил внимание, что точно то же самое вызвали в объявлении константы… даже не знаю что думать


ArbNet
Aisamiery:
Это статический метод класса

Если бы был знак $ перед $DB::query вопросов нет

::query — да, статичный метод

К статичному методу класса обращаются через self::$query или извне $DB::$query

А вот это «DB::query» мне не понятно стало

Извиняюсь, конечно, последнее время писал только на JS, PHP подзабывать стал


Sitealert
ArbNet:
Если бы был знак $ перед $DB::query вопросов нет

А не наоборот? 😂

И тогда как понимать это?

ArbNet:
DataBase::Instance());

Я же посоветовал удалить эту ахинею, почему не послушал совета? А дальше ещё усугубил.

Ну да, в хренворках пхп не нужен, там же всё в машинных кодах написано. 😮

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *