2011-12-14 3 views
-1

У меня есть запросы, как показано ниже. Могут ли они быть оптимизированы или кто-то может предложить, как индексировать?медленный запрос mysql, установка индексов или оптимизация

SELECT t1.`Geo ID`, 
     t1.`Sub Unit Geo ID`, 
     t1.`Sub Unit SW ID`, 
     t1.`Building No`, 
     t1.`Building Name`, 
     t1.Road, 
     t2.ID `Matching NEW_ID`, 
     t2.Sub, 
     t2.SUB_BUILDING_NAME, 
     t2.BUILDING_NAME, 
     t2.BUILDING_NUMBER, 
     t2.THOROUGHFARE, 
     t2.E - t1.Easting `East Difference`, 
     t2.N - t1.Northing `North Difference` 
FROM upcdata t1 JOIN 
     newer t2 ON (t2.E * 1000) BETWEEN t1.Easting - 25000 AND t1.Easting + 25000 
        AND (t2.N * 1000) BETWEEN t1.Northing - 25000 AND t1.Northing + 25000 
        AND t1.Road = t2.THOROUGHFARE 
        AND t1.`Building Name` = t2.BUILDING_NAME 
        AND t1.`Building Name` <> "" 
ORDER BY t1.`Geo ID` 
+0

Это не то, для чего мы здесь. –

ответ

2

Индексы не используются для вычисленных значений, но вы можете изменить ваш запрос, так что решите это!
Изменить between поставить умножение на значении:

.... 
join newer t2 
    ON t2.E BETWEEN (t1.Easting - 25000)/1000 AND (t1.Easting + 25000)/1000 
    AND t2.N BETWEEN (t1.Northing - 25000)/1000 AND (t1.Northing + 25000)/1000 
.... 

Сравнение математически идентично, но это означает, что между имеют 2 фиксированных значения смотреть на, вместо того, чтобы умножить значения t2 для каждого строка и не использовать индекс из-за этого.

Даже без индексов, избегая миллиона вычислений, это будет намного быстрее.

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