Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL数据库索引性能问题_Mysql_Database_Performance_Indexing - Fatal编程技术网

MySQL数据库索引性能问题

MySQL数据库索引性能问题,mysql,database,performance,indexing,Mysql,Database,Performance,Indexing,我有一个数据库,我正试图索引 我创建的索引如下: CREATE INDEX <name> ON geoplanet_places(name(15)); 结果将在不到1秒的时间内返回 运行此查询时(请注意传统的“%”通配符): 结果返回时间大大增加,有时超过9秒。这与为数据库编制索引之前花费的时间大致相同 这个数据库有超过500万条记录,我理解它为什么会慢下来。我想知道的是,在MySQL中,是否有任何方法可以在名称之前执行通配符,而不会造成如此巨大的性能损失 提前感谢。MySQL索引

我有一个数据库,我正试图索引

我创建的索引如下:

CREATE INDEX <name> ON geoplanet_places(name(15));
结果将在不到1秒的时间内返回

运行此查询时(请注意传统的“%”通配符):

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

这个数据库有超过500万条记录,我理解它为什么会慢下来。我想知道的是,在MySQL中,是否有任何方法可以在名称之前执行通配符,而不会造成如此巨大的性能损失


提前感谢。

MySQL索引是从列的前导部分创建的-第一个查询在列的开头查找“温哥华”-完全在索引的15个字符内。但是,第二个查询在列中的任何位置查找“vancouver”-不能保证它在索引的15个字符内(如果索引能够查找索引字符串部分开头以外的其他位置,我会非常惊讶)-如果查看查询计划,您可能会看到一个表扫描,其中引擎按顺序查看列中的所有值

这看起来有点像你应该研究MySQL的索引——上次我研究它时,它还不够好,不足以制作一个搜索引擎,但它可能会解决你的问题(看起来现代MySQL还支持InnoDB表上的全文索引,以及它在历史上被限制使用的MyISAM表)

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