我有一个我想要索引的数据库
我创建的索引如下:
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中获得如此巨大的性能。
提前致谢。
答案 0 :(得分:1)
MySQL索引是从列的前导部分创建的 - 第一个查询在列的开头查找“vancouver” - 完全在索引的15个字符中。然而,第二个查询在列中查找“温哥华”任何位置 - 不能保证它将在索引的15个字符内(如果索引能够,我会非常惊讶看看除了索引字符串部分的开头之外的某个地方) - 如果你查看了查询计划,你可能会看到一个表扫描,其中引擎依次查看列中的所有值。
看起来有点像你应该调查MySQL的FULLTEXT索引 - 上次我看它时做一个搜索引擎还不够好,但它可能会解决你的问题(它看起来也像是现代的MySQL支持InnoDB表上的FULLTEXT索引以及历史上限制的MyISAM表。