次の SQL を最適化して、サーバーの読み込みを高速化し、使用率を下げる方法を知りたいですか?
米国の郵便番号の半径距離を計算して、特定の郵便番号から 50 マイル (緯度と経度を使用して計算) などの結果を取得し、データベースから他のデータ (他の郵便番号など) を取得する必要があります。 .
結果を取得したら (たとえば、特定の郵便番号から 50 マイル以内に異なる郵便番号の 350 行を取得した場合)、それらを別のクエリに渡して合計行をカウントし、それを単純な 1 つの結果で表示して読み取る必要があります。これが私のクエリの例です:
SELECT count(*)
FROM
( SELECT b.ID, ROUND((acos(sin(3.142/180*32.91336) * sin(3.142/180*z.latitude) + cos(3.142/180*32.91336) * cos(3.142/180*z.latitude) * cos((3.142/180*z.longitude) - (3.142/180*-85.93836))) * 3959),2) AS distance
FROM zipcode2business.accountants b LEFT JOIN zipcodeworld.storelocator_us z ON b.ZIPCODE = z.ZIP_CODE
WHERE z.latitude != 32.91336 AND z.longitude != -85.93836
AND b.STATE='AL'
HAVING distance between 0 AND 50)
as total;
正しい結果 ( 350 行 ) が表示されますが、この SQL を実行すると CPU 使用率が高くなるため、最適化された方法で実行する必要があります。このクエリに対して EXPLAIN を実行すると、次のように表示されます。
+----+-------------+-------+--------+------------------+---------+---------+----------------------------+------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+------------------+---------+---------+----------------------------+------+------------------------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
| 2 | DERIVED | b | ref | ZIPCODE,STATE | STATE | 4 | | 3900 | Using where |
| 2 | DERIVED | z | eq_ref | PRIMARY,LAT_LONG | PRIMARY | 9 | zipcode2business.b.ZIPCODE | 1 | Using where |
+----+-------------+-------+--------+------------------+---------+---------+----------------------------+------+------------------------------+
3 rows in set (0.20 sec)
さて、上記の説明から、EXTRAの「最適化されたテーブルを選択する」は良いことですか?このクエリを実行するための最も完璧な最適化 SQL を 1 つ教えてください。