优化像查询一样的mysql

时间:2011-02-02 05:13:20

标签: sql mysql ruby-on-rails

我将jquery自动完成插件添加到我的地方文本字段,以帮助用户更好地选择位置。我在构建之前没有意识到的是查询会非常慢。

select * from `geoplanet_places` where name LIKE "%San Diego%" AND (place_type = "County" OR place_type = "Town")

上面的查询耗时1.18秒。然后我尝试为nameplace_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

2 个答案:

答案 0 :(得分:3)

您可以将表格的存储引擎切换为MyISAM,以利用全文索引。

name索引不会帮助您,除非您将类似内容更改为LIKE 'San Diego%',可以对索引执行前缀搜索

答案 1 :(得分:2)

摆脱where-like子句中的前导'%',使其成为:其中名称如“San Diego%”。对于自动完成,这似乎是一个合理的限制(假设用户开始键入正确的字符),这应该显着加快查询速度,因为MySql将能够使用现有索引(index_geoplanet_places_on_name)。