我将jquery自动完成插件添加到我的地方文本字段,以帮助用户更好地选择位置。我在构建之前没有意识到的是查询会非常慢。
select * from `geoplanet_places` where name LIKE "%San Diego%" AND (place_type = "County" OR place_type = "Town")
上面的查询耗时1.18秒。然后我尝试为name
和place_type
添加索引,但这只会减慢速度(1.93秒)。
有没有办法优化此查询,还是有其他技术可以加快查询速度。
此geoplanet_places表有437,715行(mysql)
CREATE TABLE `geoplanet_places` (
`id` int(11) NOT NULL auto_increment,
`woeid` bigint(20) default NULL,
`parent_woeid` bigint(20) default NULL,
`country_code` varchar(255) collate utf8_unicode_ci default NULL,
`name` varchar(255) collate utf8_unicode_ci default NULL,
`language` varchar(255) collate utf8_unicode_ci default NULL,
`place_type` varchar(255) collate utf8_unicode_ci default NULL,
`ancestry` varchar(255) collate utf8_unicode_ci default NULL,
`activity_count` int(11) default '0',
`activity_count_updated_at` datetime default NULL,
`bounding_box` blob,
`slug` varchar(255) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index_geoplanet_places_on_woeid` (`woeid`),
KEY `index_geoplanet_places_on_ancestry` (`ancestry`),
KEY `index_geoplanet_places_on_parent_woeid` (`parent_woeid`),
KEY `index_geoplanet_places_on_slug` (`slug`),
KEY `index_geoplanet_places_on_name` (`name`),
KEY `index_geoplanet_places_on_place_type` (`place_type`)
) ENGINE=InnoDB AUTO_INCREMENT=5652569 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
EXPLAIN
id 1
select_type SIMPLE
table geoplanet_places
type ALL
possible_keys index_geoplanet_places_on_place_type
key NULL
key_len NULL
ref NULL
rows 441273
Extra Using where
答案 0 :(得分:3)
您可以将表格的存储引擎切换为MyISAM
,以利用全文索引。
name
索引不会帮助您,除非您将类似内容更改为LIKE 'San Diego%'
,可以对索引执行前缀搜索
答案 1 :(得分:2)
摆脱where-like子句中的前导'%',使其成为:其中名称如“San Diego%”。对于自动完成,这似乎是一个合理的限制(假设用户开始键入正确的字符),这应该显着加快查询速度,因为MySql将能够使用现有索引(index_geoplanet_places_on_name)。