【发布时间】:2012-07-23 14:46:20
【问题描述】:
我有一个 MySql InnoDB 表,其中包含一个 source 字段,大约有十亿行。所有源字段值都是 url,所以它们都以 http:// 开头(没有 https)。
如果我从值中删除所有 http:// 开头,是否会提高 source 字段的选择性能?
【问题讨论】:
标签: mysql database optimization indexing query-optimization
我有一个 MySql InnoDB 表,其中包含一个 source 字段,大约有十亿行。所有源字段值都是 url,所以它们都以 http:// 开头(没有 https)。
如果我从值中删除所有 http:// 开头,是否会提高 source 字段的选择性能?
【问题讨论】:
标签: mysql database optimization indexing query-optimization
这取决于。
我假设您的 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 进行预处理,以便能够创建与您的查询一起使用的索引。如果您根本没有索引,那么创建一个有效的索引应该是您的第一个优化步骤。
【讨论】: