【问题标题】:Does fixed preprendet string in a MySql indexed table cause performance issues?MySql 索引表中的固定 preprendet 字符串是否会导致性能问题?
【发布时间】:2012-07-23 14:46:20
【问题描述】:

我有一个 MySql InnoDB 表,其中包含一个 source 字段,大约有十亿行。所有源字段值都是 url,所以它们都以 http:// 开头(没有 https)。

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

【问题讨论】:

    标签: mysql database optimization indexing query-optimization


    【解决方案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 进行预处理,以便能够创建与您的查询一起使用的索引。如果您根本没有索引,那么创建一个有效的索引应该是您的第一个优化步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2016-11-06
      • 2017-12-10
      • 2012-08-02
      • 1970-01-01
      相关资源
      最近更新 更多