かもしれません 最良の解決策になります。最初に他の答えをいくつか取得しましょう...
EXPLAIN SELECT ...
とは いう? (これはあなたのQ2に答えるかもしれません。)
他の回答に関係なく、クエリはテーブル全体をスキャンします。おそらくあなたはLIMIT ...
が欲しいでしょう 最後に?
役立つ可能性のあるもう1つのこと(アプリとオプティマイザーによって異なります):WHERE
にバウンディングボックスを追加します 条項。
いずれの場合も、実際にタッチされた行の数を正確に把握するには、次の手順を実行します。
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
それらの答えを取り戻してください。その後、さらに繰り返すことができます。
ステータスの表示後
ええと、Handler_read_rnd_next
全表スキャンだったと言います。 1000と1001-LIMIT 1000
はありましたか ?
そのLIMIT
を推測します SPATIAL
の方法には考慮されていません 動作します。つまり、単純なことを行います-(1)すべての行をチェックし、(2)並べ替え、(3)LIMIT
。
では、どうすればよいですか?
プランA:Xマイル(km)を超える結果を望まないことを決定し、クエリに「バウンディングボックス」を追加します。
プランB:Spatialを放棄し、タスクを実行するためのより複雑な方法を掘り下げます: http:// mysql.rjweb.org/doc.php/latlng