在MySql索引表中修复的preprendet字符串是否会导致性能问题?

时间:2012-07-25 07:59:50

标签: mysql database optimization indexing query-optimization

我得到了一个MySql InnoDB表,其中包含一个大约有十亿行的source字段。所有源字段值都是网址,因此它们都以http://(无https)开头。

如果我从值中移除所有source开头,是否会提高http://字段的选择效果?

1 个答案:

答案 0 :(得分:1)

这取决于。

我假设您的source字段有索引。 MySQL中varchar字段的索引仅适用于前缀,即它们只能在搜索整个值(... where source = "some value")或从位置0(... WHERE source LIKE "some value%")开始的值的子字符串时使用。如果查询任意子串(即... WHERE source LIKE "%some value%"),MySQL就无法使用索引。

在varchar或text列上创建索引时,您可以选择指定索引长度(KEY indexName (source(10)))。如果这样做,索引将仅覆盖(在此示例中)URL的最左边10个字符。如果未指定索引长度,则会对整个字段值建立索引 - 这会使索引更大,但更多选择性(索引选择性是索引中不同值的数量除以总数索引值。这个比率越接近1越好。如果您使用的是TEXT或BLOB类型,则需要索引长度。现在,如果您有索引,已设置索引长度并查询URL前缀,如上所述,则是,从URL中删除“http://”将使您的索引更具选择性,从而更快。更快的速度取决于您的数据,索引长度以及索引的选择性,因此您应该对其进行测量。不过,我怀疑它最终会产生很大的不同,如果确实如此,你可能会通过修改指数来获得更多收益。

如果您不查询URL前缀或完整URL,则可能需要预处理URL以便能够创建适用于您的查询的索引。如果您根本没有索引,那么制作一个有效索引应该是您的第一个优化步骤。