我很欣赏数据库表中NULL值的语义含义,不同于false和空字符串''.但是,当字段可以为空时,我经常阅读有关性能问题的内容,并建议在NULL实际上在语义上正确的情况下使用空字符串.
什么情况适合使用可空字段和NULL值?有什么权衡取舍?简单地避免完全使用NULL并简单地使用空字符串,false或0表示缺少值是明智的吗?
UPDATE
好的 - 我理解'和NULL之间的语义差异以及NULL是适当的字段值的(性能不可知)情况.但是,让我扩展一下暗示的性能问题.这是来自Schwartz,Zeitsev等人的优秀"高性能MySQL" http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:
MySQL更难以优化引用可空库存的查询,因为它们使索引,索引统计和值比较更加复杂.可空列使用更多存储空间,并且需要在MySQL内部进行特殊处理.当索引可空列时,每个条目需要一个额外的字节,甚至可以在MyISAM中将固定大小的inded(例如单个整数列上的索引)转换为可变大小的列.
更多信息: Google图书预览
这很可能是明确的答案 - 我只是在寻找前线的第二意见和经验.
在MySQL中使用default null或default ""用于文本字段更好吗?
为什么?
更新:我知道他们每个人的意义.我感兴趣的是考虑磁盘空间和性能更好.
更新2:嘿ppl!问题是"什么是更好用"而不是"每个意味着什么"或"如何检查它们"......
Mysql中NULL和空字符串有什么区别?
它需要多少存储空间?
例如 .
在用户表中
name:NULL - 占用多少空间
电话: - 占用多少空间
我有一个包含25列的表,其中20列可以为某些(30-40%)行提供空值.现在拥有20个空列的行的成本是多少?这个可以吗?
要么
有另一个表存储这20列并在第一个表中添加ref是一个很好的设计吗?这样我只会在有值时写入第二个表.
我正在使用SQL Server 2005.将来会迁移到2008.
只有20列是varchar,其余是smallint,smalldate
我正在存储的内容:这些列存储它所属行的不同属性.这些属性有时可以为null.
该表将容纳数十亿行
请评论.
我正在创建一个30-50列的表.这些行大约有200K.是否建议将此数据存储在单独的表中?如果有这么多列,是否存在性能问题.
我会解释一下桌子.我必须存储过去10年的所有体育比赛(篮球,棒球,足球,曲棍球).对于其中的每一个,我需要保留其他数据.其中一些数据允许我重复使用各种体育领域.例如,每个团队都有一个主客场球队和一个赛事日期.
然而,对于这些游戏中的每一个,我也存储了诸如实现了多少次初次下降,多少三振出局以及三个指针.显然,此数据仅涉及表中的某些行.因此,我最终在每一行中都有很多NULL字段.
如有必要,我可以提供更多细节.提前感谢任何一般建议.
我很抱歉,如果这只是询问MySQL表上的存储空间的另一种方式,例如: MySQL中的NULL(性能和存储)
但我的问题确实与最佳做法有关.
假设我有一个表格,可以在给定的时间点收集客户的所有"必要"信息.12个月在路上,我意识到我还喜欢捕捉人的出生日期和性别,如果他们希望提供它(场的数量是有些无关紧要,但理解它可以是一个或50个字段).
最佳做法是将新字段添加到现有表中,设置并允许所有初始值为NULL,然后使用新数据更新现有记录
要么
创建一个新表并根据主键的存在与主表建立关系?
我在 MySql 服务器中有一个表,该表包含大约 1M 行。只是因为一个列表每天都在占用更多的磁盘空间。此列的数据类型为 Mediumblob。表大小约为 90 GB。
在每一行插入之后,我做一些处理然后在我真的不需要这个列之后。
那么对于这一列,如果我在处理该行后将该值设置为 NULL,MySql 是否利用这个空白空间进行下一行插入?
MySql 服务器详细信息
服务器版本:5.7
引擎:InnoDB
托管:谷歌云Sql
编辑 1:我从表中删除了 90% 的行,然后我运行了 OPTIMIZE TABLE table_name 但它只减少了 4GB 的磁盘空间并且它没有回收可用磁盘空间。
编辑 2 我什至删除了我的数据库并创建了新的数据库和表,但 MySql 服务器仍然显示 80GB 磁盘空间。MySQL服务器所有数据库的大小
SELECT table_schema "database name",
         sum( data_length + index_length ) / 1024 / 1024 "database size in MB",
         sum( data_free )/ 1024 / 1024 "free space in MB"
     FROM information_schema.TABLES
     GROUP BY table_schema; 
+--------------------+---------------------+------------------+
| database name      | database size in MB | free space in …最近,我一直在考虑是否值得拥有一个可能有很多NULL列的表,或者如果有更多表没有NULL则更好.我听说过InnoDB上没有存储NULL,所以我想知道是否存在任何有很多NULL的行的缺点或问题.我一直听说常见的NULL很糟糕,但我从未真正了解过原因.顺便说一下,如果重要的话,外键上的那些将是NULL.
第二个疑问,当我在有很多NULL的列上使用INNER JOIN时是否有任何性能问题?就像,如果我有4个外键,并且我要做4个INNER JOIN,但很可能只有1个不是NULL,这是否会影响性能?谢谢
我经常使用MySQL和SQLite,并计划很快将更多PostgreSQL引入我的工作流程。考虑到这一点,在每个数据库中使用 NULL 的成本是多少?我听说 MySQL 为每个 NULL 列值添加了一个额外的位,以将其标记为可空。
我是MySQL新手.我不确定我是对的.需要帮忙.
我有一个表格survey,其中包含以下列:
id, source_type, source_id, survey_date_time.
其他两个表是:
education哪个有id, col1, col2, col3列.
games哪个有id, col4, col5, col6列.
survey表格中的数据:
id       source_type    source_id    survey_date_time
--------------------------------------------------------
100      education         1         2013-07-25 00:00:00
101      games             1         2013-07-25 00:00:00
102      games             2         2013-07-26 00:00:00
103      education         2         2013-07-26 00:00:00
education表中的数据
id    col1          col2          col3      
--------------------------------------------
1     col1_data1    col2_data1    col3_data1
2     col1_data2    col2_data2    col3_data2
games表中的数据
id    col4          col5          col6      
--------------------------------------------
1     col4_data1    col5_data1    col6_data1
2     col4_data2    col5_data2 …据我了解,应尽可能避免数据库中的可为空列。
但是,在哪些特定情况下,可空列实际上会导致性能显着下降?
换句话说,null 什么时候会真正损害性能?(而不是当它可以忽略不计,并且根本不重要时)。
我这样问是为了知道它何时以及如何真正产生影响。
mysql ×11
null ×3
sql ×3
database ×2
innodb ×1
jointable ×1
optimization ×1
postgresql ×1
sqlite ×1