我有一个 MySql InnoDB 表,其中包含一个source
大约十亿行的字段。所有源字段值都是 url,所以它们都以http://
(No https) 开头。
source
如果我从值中删除所有http://
开头,它会提高现场的选择性能吗?
我有一个 MySql InnoDB 表,其中包含一个source
大约十亿行的字段。所有源字段值都是 url,所以它们都以http://
(No https) 开头。
source
如果我从值中删除所有http://
开头,它会提高现场的选择性能吗?
这取决于。
我假设你在你的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 进行预处理,以便能够创建适用于您的查询的索引。如果您根本没有索引,那么创建一个有效的索引应该是您的第一个优化步骤。