MySQL数据库索引性能问题

时间:2012-03-28 04:50:20

标签: mysql database performance indexing

我有一个我想要索引的数据库

我创建的索引如下:

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

当我运行以下查询时:

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

结果在不到1秒的时间内返回

当我运行此查询时(请注意aditional'%'外卡):

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

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

数据库有超过500万条记录,我理解它为什么会变慢。我想知道的是,无论如何都要在名称之前使用外卡而不会在MySQL中获得如此巨大的性能。

提前致谢。

1 个答案:

答案 0 :(得分:1)

MySQL索引是从列的前导部分创建的 - 第一个查询在列的开头查找“vancouver” - 完全在索引的15个字符中。然而,第二个查询在列中查找“温哥华”任何位置 - 不能保证它将在索引的15个字符内(如果索引能够,我会非常惊讶看看除了索引字符串部分的开头之外的某个地方) - 如果你查看了查询计划,你可能会看到一个表扫描,其中引擎依次查看列中的所有值。

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