Intereting Posts
Сортировка данных массива Php по значениям другого массива Как конвертировать видео в фоновом режиме с помощью PHP и ffmpeg Вывод исходного потока изображения, а не jpeg, изменение размера изображения Создайте сообщение электронной почты для Outlook с заполненным BCC Какой тип webservice лучше всего работает с iOS? Отправить по электронной почте Асинхронно через PhpMailer Как вставить переменную php в объект / массив javascript Как перебирать элементы массива для создания нескольких запросов на вставку Мне нужно использовать (int) $ id, прежде чем использовать $ id в bindValue в Php PDO Доступ Apache к связанным с NTFS папкам в Linux Как преобразовать массив байтов в целое число в php? Как получить правильный soundcloud url для встраивания из стандартного URL-адреса? Несколько форм загрузки Как извлечь значение из веб-сайта (используя cUrl в PHP) Ошибка при загрузке php-модуля

Правильно оптимизируйте запрос PHP Mysqli

Недавно я немного помог с кодировкой INNER JOIN, чтобы помочь оптимизировать медленный скрипт, который у меня есть. После оптимизации оставшегося кода и тестирования я теперь смог определить, что это ниже запросы, которые замедляют работу скрипта.

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

$cqry = "SELECT * FROM ftree_node WHERE id IN "; if($wrow['A'] == 'F') { $cqry .= '(SELECT DISTINCT t1.relation_from FROM ftree_tree_node_relation AS t1, ftree_tree_node_relation AS t2 WHERE '; $cqry .= '(t1.relation_from=t2.relation_from) AND (t1.relation_type <> t2.relation_type) AND '; $cqry .= '(t1.relation_to ='.$treeDB->real_escape_string($rrow[id]).' AND t1.relation_type="'.$treeDB->real_escape_string($FAT).'") AND (t2.relation_to = '.$treeDB->real_escape_string($wrow[id]).' AND t2.relation_type = "'.$treeDB->real_escape_string($MOT).'"))'; } else { $cqry .= '(SELECT DISTINCT t1.relation_from FROM ftree_tree_node_relation AS t1, ftree_tree_node_relation AS t2 WHERE '; $cqry .= '(t1.relation_from=t2.relation_from) AND (t1.relation_type <> t2.relation_type) AND '; $cqry .= '(t1.relation_to = '.$treeDB->real_escape_string($rrow[id]).' AND t1.relation_type="'.$treeDB->real_escape_string($MOT).'") AND (t2.relation_to = '.$treeDB->real_escape_string($wrow[id]).' AND t2.relation_type = "'.$treeDB->real_escape_string($FAT).'"))'; } $cres = $treeDB->query($cqry); 

Спасибо вам всем.

Попробуйте избавиться от подвыборки:

Пример:

 SELECT fn.* FROM ftree_node fn INNER JOIN ftree_tree_node_relation ftnr1 ON ftnr1.relation_from = fn.id INNER JOIN ftree_tree_node_relation ftnr2 ON ftnr2.relation_from = fn.id WHERE ftnr1.relation_type <> ftnr2.relation_type AND (ftnr1.relation_to = ???? AND t1.relation_type= ???? AND ( ftnr2.relation_to = ???? AND ftnr2.relation_type = ???? ) ) 

Затем, если он все еще медленно анализирует его с помощью EXPLAIN EXTENDED чтобы убедиться, что индексы используются правильно.

Примечание . Запрос выше не был протестирован, он служит для указания. Я удалил значения с помощью ???? для лучшей удобочитаемости.