具有70%空值的列的索引:使用null或空值?

Lio*_*nel 11 mysql indexing performance null

我们目前正在优化一个MySQL表(InnoDB),它甚至会有超过1亿行.

在一列中,我们存储IP地址(VARCHAR 45).我们需要在此列上放置一个索引,因为我们必须能够检索每个特定IP地址的所有行.

但是,所有行的70%不会存储IP地址().

我们的问题:我们应该将这些空值存储为NULL,从而在此列上允许NULL(将为每一行添加1个字节).或者我们不应该允许NULL并将那些空值存储为''(空字符串)

什么是最佳表现?

我们永远不必搜索空(='')或空(IS NULL)的行,只搜索特定的IP地址(='123.456.789.123').

更新:在SO上确实有很多问题可以解决类似的问题.然而,一些答案似乎是矛盾的或说"它取决于".我们将运行一些测试并在此处针对我们的具体方案发布我们的发现.

Ric*_*mes 2

VARCHAR(39)对于 IPv4(旧格式,没有更多可用值)和 IPv6 来说就足够了。

如果 70% 的值相同(“”或 NULL),优化器可能会搞砸。我建议您再准备一个包含 IP 和 ID 的表,用于 JOINing 返回到原始表。由于第二个表中没有“空”IP,优化器更有可能“做正确的事情”。

这样就LEFT JOIN可以用来查看是否有IP了。

IPv6 可以存储在 BINARY(16) 中以节省空间。