ORDER BY, чтобы MySQL-запрос выполнялся очень медленно - PullRequest
0 голосов
/ 04 декабря 2011

У меня следующий запрос MySQL:

SELECT 
   table1.*, table2.*    
FROM 
   `Table1` AS table1, 
   `Table2` AS table2, 
   `Table3` 
WHERE 
   table1.col1 = table2.col1 AND
   table1.col1 = Table3.col1 AND  
   table1.col1 != '0' AND 
   table1.col1 NOT IN (1,2) 
   table1.col2 LIKE 'A' AND 
   (table1.col3 LIKE 'A' OR table1.col3 LIKE 'B') AND 
   Table3.col4 = 0 AND 
   Table3.col5 = 0 AND 
   Table3.col6 = 0 
ORDER BY 
   table1.col10 ASC 
LIMIT 0, 5

Без оператора ORDER BY он выполняется за 0,002 секунды.

С оператором ORDER BY он выполняется за 2 секунды.

Я видел этот ответ , который, казалось, работал на OP, но когда я попробовал его на моем, я получил ошибку Duplicate column name 'col1'.

Любые идеи о том, как я могуускорить это с помощью ORDER BY?

РЕДАКТИРОВАТЬ:

В соответствии с просьбой ниже приведен модифицированный запрос, который я пробовал на основе ссылки выше, которая дала мне Duplicate column name 'col1' ошибка:

SELECT * FROM (
    SELECT 
       table1.*, table2.*    
    FROM 
       `Table1` AS table1, 
       `Table2` AS table2, 
       `Table3` 
    WHERE 
       table1.col1 = table2.col1 AND
       table1.col1 = Table3.col1 AND  
       table1.col1 != '0' AND 
       table1.col1 NOT IN (1,2) 
       table1.col2 LIKE 'A' AND 
       (table1.col3 LIKE 'A' OR table1.col3 LIKE 'B') AND 
       Table3.col4 = 0 AND 
       Table3.col5 = 0 AND 
       Table3.col6 = 0 
) AS t1
ORDER BY 
   table1.col10 ASC 
LIMIT 0, 5

Очевидно, это должно гарантировать, что ORDER BY будет выполнен только после определения окончательного набора результатов.

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Вы также можете изучить использование временной таблицы

SELECT
   table1.*, table2.* INTO #temp
FROM 
   `Table1` AS table1, 
   `Table2` AS table2, 
   `Table3` 
WHERE 
   table1.col1 = table2.col1 AND
   table1.col1 = Table3.col1 AND  
   table1.col1 != '0' AND 
   table1.col1 NOT IN (1,2) 
   table1.col2 LIKE 'A' AND 
   (table1.col3 LIKE 'A' OR table1.col3 LIKE 'B') AND 
   Table3.col4 = 0 AND 
   Table3.col5 = 0 AND 
   Table3.col6 = 0 

SELECT * FROM #temp  
ORDER BY col10 ASC 
LIMIT 0, 5
0 голосов
/ 04 декабря 2011

Попробуйте добавить индекс для table1 и col10.

...