2015-08-11 3 views
0

У меня есть SQL-скрипт, который объединяет четыре таблицы. Я использую много операций AND. Есть ли решение, как оптимизировать этот скрипт?Оптимизация запроса, выбор из множества таблиц

SELECT s.ACCESS_CODE, a.ACCESS_CODE, MIN(b.ID), b.NAME, a.USER_ID, b.PARENT_ID,b.UPDATE_TIME 
FROM b_disk_simple_right s, b_user_access a, b_disk_object b, b_file f 
WHERE s.ACCESS_CODE = a.ACCESS_CODE 
    AND a.USER_ID = '".$userID."' 
    AND s.OBJECT_ID=b.ID 
    AND f.ID = b.FILE_ID 
    AND b.DELETED_BY=0 
    AND f.MODULE_ID = 'disk' 
GROUP BY b.ID 
+1

Используйте только одну таблицу в 'FROM', для остальных используйте' Joins'. – John

+0

Является ли этот запрос очень медленным? – Mihai

+0

У этих четырех таблиц есть какие-либо отношения (подразумеваемые внешними ключами или иным образом) между ними? – Gideon

ответ

0

Попробуйте внутреннее соединение, как показано ниже:

SELECT  s.ACCESS_CODE, a.ACCESS_CODE AS Expr1, MIN(b.ID) AS Expr2, b.NAME, a.USER_ID, b.PARENT_ID, b.UPDATE_TIME 
FROM   b_disk_simple_right AS s INNER JOIN 
       b_user_access AS a ON s.ACCESS_CODE = a.ACCESS_CODE CROSS JOIN 
       b_disk_object AS b CROSS JOIN 
       b_file AS f 
WHERE  (a.USER_ID = '".$userID."') AND (s.OBJECT_ID = b.ID) AND (f.ID = b.FILE_ID) AND (b.DELETED_BY = 0) AND (f.MODULE_ID = 'disk') 
GROUP BY b.ID 
0

Во-первых, вы должны выяснить, является ли эта операция на самом деле ограничение скорости вашего приложения. Если это не так, то это, вероятно, not worth worrying about. Наконец, без изменения схемы или индексов вы не будете выжимать намного больше из нее (достойная система БД оптимизирует ее для вас, прежде чем запускать ее).

Смежные вопросы