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 = '张三';

  • 相关阅读:
    链表逆序输出 ---九度1511
    java 通过ssh连接linux服务器的测试代码
    C/C++时间函数总结
    C,C++,windows api, linux api 操作文件总结
    基于大数据计算思想的分布式数据库
    手机定位的方式
    矩阵取数问题
    回文字符串
    linux shell重定向总结
    apache flink 入门
  • 原文地址:https://www.cnblogs.com/songxiaohua/p/11656878.html
Copyright © 2011-2022 走看看