クエリ結果を高速化するために、テーブルを最適化したいと思います。現在、InnoDBの代わりにMyISAMを使用しています。
問題は、最初の郵便番号は5文字の長さで、 A文字で始まらないということです。これらの郵便番号はすべて、A文字で始まります。長さは6文字または7文字で、テーブルレコードのほぼ中央にあります。私のテーブルのレコードはAZ順である必要がありますか、それとも郵便番号の長さ(テーブルの上部にリストされている文字が少ないレコード)の方が最適化に適していると思いますか?
または、他に何を提案しますか?
テーブル構造:
CREATE TABLE `postcodes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`postcode` varchar(10) NOT NULL,
`latitude` decimal(25,20) NOT NULL,
`longitude` decimal(25,20) NOT NULL,
`fk_areas_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_postcodes_postcode` (`postcode`) USING HASH
) ENGINE=MyISAM AUTO_INCREMENT=1696089 DEFAULT CHARSET=utf8;
質問:
SELECT
(@rownum := @rownum + 1) AS No,
postcode AS Postcode,
latitude AS Latitude,
longitude AS Longitude,
(
(
ACOS(SIN((SELECT latitude FROM postcodes WHERE postcode = $postcode) * PI() / 180) * SIN(latitude * PI() / 180) +
COS((SELECT latitude FROM postcodes WHERE postcode = $postcode) * PI() / 180) * COS(latitude * PI() / 180) *
COS(((SELECT longitude FROM postcodes WHERE postcode = $postcode) - longitude) * PI() / 180)) * 180 / PI()
) * 60 * 1.1515
) AS Distance
FROM postcodes, (SELECT @rownum := 0) AS No
HAVING Distance <= 0.5 /*miles*/
ORDER BY Distance ASC