Недавно я немного помог с кодировкой 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
чтобы убедиться, что индексы используются правильно.
Примечание . Запрос выше не был протестирован, он служит для указания. Я удалил значения с помощью ????
для лучшей удобочитаемости.