2012-03-28 197 views
0

我有我试图索引数据库MySQL数据库索引性能问题

我所创建的指标如下:

CREATE INDEX <name> ON geoplanet_places(name(15)); 

当我运行以下查询:

SELECT * FROM geoplanet_places WHERE name LIKE "vancouver%"; 

结果在不到1秒钟内返回

当我运行此查询(注意adition %'通配符):

SELECT * FROM geoplanet_places WHERE name LIKE "%vancouver%"; 

结果返回时间大大增加,有时会超过9秒钟。这与数据库建立索引之前的时间大致相同。

该数据库有超过500万条记录,我明白它为什么会放慢速度。我想知道的是,如果无论如何在名称之前使用通配符,而没有在MySQL中发挥如此巨大的性能。

在此先感谢。

回答

1

MySQL索引是从列的前面部分创建的 - 第一个查询在列的起始处查找'vancouver' - 完全在索引的15个字符之内。然而,第二个查询在列中查找'vancouver'任何地方 - 不能保证它将在索引的15个字符之内(并且如果索引能够看起来不是索引字符串部分的开始) - 如果查看查询计划,您可能会看到一个表扫描,其中引擎正在按顺序查看列中的所有值。

它看起来有点像你应该调查MySQL的FULLTEXT索引 - 上次我看它时,它不够好做搜索引擎,但它可能解决你的问题(它也看起来好像现代MySQL支持FULLTEXT InnoDB表上的索引以及历史限制的MyISAM表)。

+0

完美地工作,感谢您的帮助! – ThreadedLemon 2012-03-28 06:20:14