【发布时间】:2015-12-19 13:48:47
【问题描述】:
我们目前正在优化一个 MySQL 表 (InnoDB),该表最终将拥有超过 1 亿行。
在一列中,我们存储 IP 地址 (VARCHAR 45)。我们需要在该列上放置一个索引,因为我们必须能够检索每个特定 IP 地址的所有行。
但是,70% 的所有行不会存储 IP 地址(空)。
我们的问题:我们是否应该将这些空值存储为 NULL,因此在此列上允许 NULL(将为每行添加 1 个字节)。 或者我们是否应该不允许 NULL 并将那些空值存储为作为''(空字符串)?
什么最有利于性能?
我们将永远不必搜索空行 (= '') 或 null (IS NULL),只搜索特定的 IP 地址 (= '123.456.789.123')。
更新:确实有很多关于 SO 的问题可以解决类似的情况。但是,有些答案似乎是矛盾的,或者说“视情况而定”。我们将在此处运行一些测试并针对我们的特定场景发布我们的发现。
【问题讨论】:
-
我想空字符串会稍微提高性能,因为它使用更少的存储空间。无论哪种方式,该指数都将基本相同。最好的解决方案是您测试和验证更快的解决方案
-
MySQL: NULL vs ""的可能重复
-
@Shadow 是的,似乎是一个类似的问题 - 但乍一看,在我看来,两个得分最高的答案是否相反?一个说“使用 null”,另一个说“不要使用 null!”。
-
得分最高的 2 个答案实际上并没有明确表示是或否。第三个答案是明确的索引。
-
@Lionel 1. Inet6_aton() 在 v5.6 中可用,使用 inet6_ntoa() 您可以轻松地将数字形式转换回人类可读的形式。 2. 在优化相关的问题中,你很少能得到直接的答案。你也不会在这里得到一个。另一个主题列出了您需要考虑的所有要点,然后您需要在您的特定环境和您的数据中评估哪些更有效。 3. 什么对您来说更重要:速度还是数据存储?
标签: mysql performance indexing null