zoukankan      html  css  js  c++  java
  • 为什么建议MySQL列属性尽量用NOT NULL

           在《高性能MySQL》中提到,通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。虽然把NULL 改成NOT NULL 对索引的性能并没有明显提升,但可能会出现不必要的麻烦。

    测试如下:

    CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `name` VARCHAR(25) NOT NULL,
        PRIMARY KEY (`id`),
        KEY `idx_name` (`name`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `t2` (
      `id` int(11) NOT NULL,
      `name` VARCHAR(25) DEFAULT NULL,
        PRIMARY KEY (`id`),
        KEY `idx_name` (`name`)
        ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    创建表SQL语句

     表t1

     表t2

     1.NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回空行的结果集

    SELECT * from t2 where name != '张三';

    select * from t2 where name not in (select name from t2 where id!=1)

     2.使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL

    SELECT CONCAT("1",NULL);

     3.当用count函数进行统计时,NULL 列不会计入统计

    SELECT count(name) from t2;

     4、查询空行数据,用 is NULL

    SELECT * FROM t2 where name is NULL;

     5、NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。

    explain SELECT * from t1 where name = '张三';

    explain SELECT * from t2 where name = '张三';

  • 相关阅读:
    顺序容器添加,查询,删除元素
    使用fiddler对app做弱网测试
    工作总结
    软件测试面试题_3
    软件测试面试题_2
    软件测试面试题_1
    MySQL的下载及安装
    关于let以及var的区别
    关于获取各种浏览器可见窗口大小的一点点研究
    log4J指定类下面的日志分隔
  • 原文地址:https://www.cnblogs.com/songxiaohua/p/11656878.html
Copyright © 2011-2022 走看看