我有一个正在尝试索引的数据库
我创建的索引如下:
CREATE INDEX <name> ON geoplanet_places(name(15));
当我运行以下查询时:
SELECT * FROM geoplanet_places WHERE name LIKE "vancouver%";
不到1秒返回结果
当我运行此查询时(请注意附加的“%”通配符):
SELECT * FROM geoplanet_places WHERE name LIKE "%vancouver%";
结果返回时间大大增加,有时会超过9秒。这与数据库索引之前花费的时间大致相同。
数据库有超过 500 万条记录,我明白为什么速度变慢。我想知道的是,是否有办法在名称之前使用通配符,而不会对 MySQL 的性能造成如此巨大的影响。
提前致谢。
最佳答案
MySQL 索引是从列的前导部分创建的 - 第一个查询在列的开头查找“vancouver” - 完全在索引的 15 个字符内。然而,第二个查询在列中任何地方查找“vancouver” - 不能保证它将在索引的 15 个字符内(如果索引能够查看索引字符串部分开头以外的其他位置) - 如果您查看查询计划,您可能会看到一个表扫描,其中引擎按顺序查看列中的所有值。
看起来你应该调查一下 MySQL 的 FULLTEXT索引 - 上次我看它时,它不足以制作搜索引擎,但它可能会解决你的问题(它看起来也好像现代 MySQL 支持 InnoDB 表以及历史上限制的 MyISAM 表上的 FULLTEXT 索引)。
关于MySQL 数据库索引性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901325/