0

私は非常に遅く(0.4秒)、インデックスを使用せずにすべてのテーブル行をスキャンしているように見えるmysql検索を持っています。10 マイルの境界ボックス内のレコードのみを検索するようにクエリを制限しようとしましたが、境界ボックスを使用していないように見えるため、クエリは同じ速度です。

不要なものを削除するために、以下のクエリを単純化しました。

SELECT lists.* , 
round( sqrt( ( ( (lists.latitude - '53.72153589619174') * (lists.latitude - '53.72153589619174') ) * 69.1 * 69.1 ) + ( (lists.longitude - '-2.4863433837890625') * (adverts.longitude - '-2.4863433837890625') * 53 * 53 ) ), 1 ) as distance
FROM lists
WHERE (lists.type_id = '3') AND (advert_type = '1') AND (lists.status = 1) AND (lists.approved = 1) 
AND (lists.latitude BETWEEN '53.5769627602' AND '53.8661090322' )
AND (lists.longitude BETWEEN '-2.73067484548' AND '-2.2420119221' )
HAVING distance < 10
ORDER BY distance ASC LIMIT 0,20

説明は次のとおりです。

id select_type table    type     possible_keys                                                                                                                    key   key_len  ref                      rows    Extra 

1  SIMPLE      lists    ref      type_breed,searchit,breedsearch,status-approved, typesearch, searchitprice,status_approved_updated, latlon, typesearch-price     searchit   4   const,const,const,const  11867   Using where; Using filesort

テーブルとインデックスは次のとおりです。

CREATE TABLE `lists` (
`advert_id` int(10) NOT NULL AUTO_INCREMENT,
`user_id` int(10) NOT NULL,
`type_id` tinyint(1) NOT NULL,
`breed_id` int(10) NOT NULL,
`advert_type` tinyint(1) NOT NULL,
`headline` varchar(50) NOT NULL,
`description` text NOT NULL,
`price` int(4) NOT NULL,
`postcode` varchar(7) NOT NULL,
`town` varchar(60) NOT NULL,
`county` varchar(60) NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
`telephone1` varchar(15) NOT NULL,
`telephone2` varchar(15) NOT NULL,
`email` varchar(80) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT '0',
`approved` tinyint(1) NOT NULL DEFAULT '0',
`date_created` datetime NOT NULL,
`date_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`expiry_date` datetime NOT NULL,
PRIMARY KEY (`advert_id`),
KEY `price` (`price`),
KEY `user` (`user_id`),
KEY `type_breed` (`type_id`,`breed_id`),
KEY `headline_keywords` (`headline`),
KEY `date_updated` (`date_updated`),
KEY `advert_index` (`price`,`status`,`approved`,`date_updated`),
KEY `searchit` (`type_id`,`advert_type`,`status`,`approved`),
KEY `breedsearch` (`type_id`,`breed_id`,`status`,`approved`),
KEY `status-approved` (`status`,`approved`),
KEY `typesearch` (`type_id`,`status`,`approved`,`date_updated`),
KEY `searchitprice` (`type_id`,`advert_type`,`status`,`approved`,`price`),
KEY `status_approved_updated` (`status`,`approved`,`date_updated`),
KEY `latlon` (`latitude`,`longitude`),
KEY `typesearch-price` (`type_id`,`status`,`approved`,`price`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
4

0 に答える 0