2011-12-14 37 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 
.... 

比較は数学的に同じですが、それはむしろ、すべてのためのT2値を乗算することよりも上で検索する2の固定値を、持っている間の意味します行は索引を使用していません。

インデックスがなくても、数百万回の計算を避けるだけで、はるかに高速になります。