我想知道如何优化以下 SQL 以让我的服务器加载更快并降低使用率?
我需要计算美国邮政编码的半径距离以获得结果,例如距特定邮政编码 50 英里(使用纬度和经度计算)并从我的数据库中获取多少其他数据(例如其他邮政编码) .
一旦我得到结果(例如,在距特定邮政编码 50 英里的范围内得到 350 行不同的邮政编码),我需要将它们传递到另一个查询中以计算总行数并以简单的方式显示它,并显示一个结果供我阅读。这是我的查询示例:
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 来执行此查询。