不使用索引(全表扫描)或边界框优化mysql距离搜索

不使用索引(全表扫描)或边界框优化mysql距离搜索,mysql,select,indexing,distance,bounding-box,Mysql,Select,Indexing,Distance,Bounding Box,我有一个mysql搜索,它非常慢(0.4秒),似乎在扫描所有表行,而不使用索引。我曾尝试将查询限制为仅在10英里边界框中查找记录,但查询的速度与它似乎没有使用边界框的速度相同 我简化了下面的查询,以删除不必要的内容: SELECT lists.* , round( sqrt( ( ( (lists.latitude - '53.72153589619174') * (lists.latitude - '53.72153589619174') ) * 69.1 * 69.1 ) + ( (lis

我有一个mysql搜索,它非常慢(0.4秒),似乎在扫描所有表行,而不使用索引。我曾尝试将查询限制为仅在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
以下是表格和索引:

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

显然,它将搜索所有行,因为
distance
column不是主列,而是生成的列。有没有办法加快此查询的速度?创建一个过程并调用该过程。也许这会加速。
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