0
SELECT D.A1, D.A2, D.A3  from D, l1
     ,l2 where
     l1.Z = "90001"and substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)
    AND 3959 * (PI()/180) * SQRT(
        POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + 
         POW( l2.A1-l1.A1, 2 ) ) <= 10');

これは実行に時間がかかります。これを高速化する方法がわかりません。

4

4 に答える 4

0

あなたのデータベースのデザインは私には奇妙に見えます、そして私はMySQLがこれらの条件でINDEXを使用できないと確信しています

substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)

今後、パフォーマンスが低下します:/

于 2012-06-08T06:56:12.910 に答える
0

coll_cs、これを試すことができます

select D1.A1, D1.A2, D1.A3
     from 
     ( 
        SELECT substring(D.A1,1,5) AS A1,
                substring(D.A2,1,5) AS A2,
                D.D3 AS D3
        from D
     ) as D1
     ,
     (
        select 
        substring(l2.A1,1,5) AS A1,
        substring(l2.A2,1,5) AS A2
        l1,l2
        where l1.Z = "90001"
        and
        3959 * 
        (PI()/180) * 
        SQRT(
        POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + 
        POW( l2.A1-l1.A1, 2 ) 
        ) <= 10
     ) as L
     where D1 = L.A1
     and   D1 = L.A2

フィールドタイプ、行数、キー、インデックスなど、テーブルに関する十分な情報がありません

更新されたフォーマット

于 2012-06-08T07:50:23.560 に答える
0

どのようなインデックスがありますか? のインデックスはありl1.Zますか? そうでない場合、これは明らかな開始方法です。

substring(l2.A1,1,5)テーブル自体のように、式の結果を格納することもできます。これにより、式の結果にインデックスを付けることができます。つまり、結合が高速になります。

また、宇宙で「近く」にあるものを見つけようとしているようにも見えます。その場合は、MySQL の空間拡張機能をご覧ください。

于 2012-06-08T06:53:24.887 に答える
0

結合を使用してクエリを書き直すことから始めて、それが何か役立つかどうかを確認する必要があります。

select D.A1, D.A2, D.A3
from D
inner join l2 on substring(D.A1,1,5) = substring(l2.A1,1,5) and substring(D.A2,1,5) = substring(l2.A2,1,5)
inner join l1 on 3959 * (PI()/180) * SQRT( POW( (l2.A2-l1.A2)*COS((PI()/180)*(l2.A1+l2.A1)/2), 2 ) + POW( l2.A1-l1.A1, 2 ) ) <= 10
where l1.Z = "90001"
于 2012-06-08T07:04:51.603 に答える