转:http://blog.csdn.net/imzoer/article/details/8518610
版权声明:本文为博主原创文章,未经博主允许不得转载。
从网上学习的时候一直看到,MySQL列建议列是非null的。说是如果是允许null的列,对索引会有影响(索引不会包括有NULL值)。
原文如下:
尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化。
因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
--------------------------------------------------
null会影响索引的统计,一般会默认null为同一个值,这样这个索引的筛选价值就降低了,影响优化器的判断。当然也可以调整参数,使得null被认为是不同的值。
-----------------------------------------------
怎么理解呢?
---------------------------------------------
先看空值跟null的区别。mysql官方:“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间(见上面的e文),还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。这也是《高性能mysql第二版》介绍的。