zoukankan      html  css  js  c++  java
  • MySQL学习笔记:少用Null

      在实际编程中,Null容易引起很多问题,例如在Java里NullPointerException猝不及防的空指针异常,因此需要过多的if判断,甚是麻烦。

      在MySQL数据库中也要少用Null,尽量保持字段not null,主要原因有以下。

    1.Null使用起来很方便,创建数据表时默认,插入数据的时候也不用过多判断;

    2.MySQL官网文档:

    Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要Mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。

    —— 出自《高性能mysql第二版》

    3.Not in、!=等负向条件查询在有Null值的情况下返回永远为空结果,查询容易出错;

    CREATE TABLE table_2 (
         `id` INT (11) NOT NULL,
        user_name VARCHAR(20) NOT NULL
    )
    
    CREATE TABLE table_3 (
         `id` INT (11) NOT NULL,
        user_name VARCHAR(20)
    )
    
    INSERT INTO table_2 VALUES (4,"zhaoliu_2_1"),(2,"lisi_2_1"),(3,"wangmazi_2_1"),(1,"zhangsan_2"),(2,"lisi_2_2"),(4,"zhaoliu_2_2"),(3,"wangmazi_2_2")
    
    INSERT INTO table_3 VALUES (1,"zhaoliu_2_1"),(2, NULL)
    
    SELECT * FROM table_2
    SELECT * FROM table_3
    SELECT user_name FROM table_2 WHERE user_name NOT IN (SELECT user_name FROM table_3 WHERE id!=1)

    4.两个字段进行拼接:比如题号+分数,首先要各字段进行非Null判断,否则只要任意一个字段为空都会造成拼接的结果为null;

    SELECT CONCAT("1",NULL) FROM DUAL; -- 执行结果为Null

    5.如果有 Null column 存在的情况下,count(Null column)需要格外注意,null 值不会参与统计;

    SELECT COUNT(user_name) FROM table_3; -- 1

    6.Null列需要更多的存储空间:需要一个额外字节判断是否为Null的标志位;

    alter table table_3 add index idx_user_name (user_name);
    alter table table_2 add index idx_user_name (user_name);
    explain select * from table_2 where user_name='lll';
    explain select * from table_3 where user_name='lll';

     

      字段为Null的列比非Null要多使用一个字节

      key_len的计算规则和三个因素有关:数据类型、字符编码、是否为Null

    总结:

      索引字段最好不要为Null,因为Null会使索引、索引统计和值更加复杂,并且需要额外一个字节的存储空间。


     END 2018-11-22 09:35:29

  • 相关阅读:
    Windows10系统中实现Android的SDK和Android studio的配置
    神经网络框架-Pytorch使用介绍
    在各个平台系统中安装Pytorch
    Jetbrain的破解
    python的collections模块的学习
    python自带的用于解析HTML的库HtmlParser
    python利用urllib和urllib2抓取百度贴吧的页面程序并下载下来在本地
    Windows下多个版本的python的使用(粘贴其他人的博客只用于自己学习,如有侵权直接删帖)
    线程同步的几种方法
    事务隔离级别
  • 原文地址:https://www.cnblogs.com/hider/p/9999160.html
Copyright © 2011-2022 走看看