zoukankan      html  css  js  c++  java
  • 索引法则--IS NULL, IS NOT NULL 也无法使用索引

    Mysql 系列文章主页 

    ===============

    1 数据准备

    1.1 建表

    DROP TABLE IF EXISTS staff;
    CREATE TABLE IF NOT EXISTS staff (
        id INT PRIMARY KEY auto_increment,
        name VARCHAR(50) NOT NULL,
        age INT,
        pos VARCHAR(50) COMMENT '职位',
        salary DECIMAL(10,2)
    );

    注意:name 字段上加了 NOT NULL 限制

    1.2 插入数据

    INSERT INTO staff(name, age, pos, salary) VALUES('Alice', 22, 'HR', 5000);
    INSERT INTO staff(name, age, pos, salary) VALUES('Bob', 22, 'RD', 10000);

    2 测试&Explain分析

    2.1 建立索引

    CREATE INDEX idx_nameAgePos ON staff(name, age, pos);

    2.2 测试

    Case#1:索引生效

    EXPLAIN SELECT * FROM staff WHERE name = 'Alice';

    分析:name 等于一个常量,当然能够使用索引

    Case#2:索引失效(IS NULL)

    EXPLAIN SELECT * FROM staff WHERE name IS NULL;

    分析:建表语句中明确表明 name 字段 NOT NULL,所以,此处的查询是不可能的

    Case#3:索引失效(IS NOT NULL)

    EXPLAIN SELECT * FROM staff WHERE name IS NOT NULL;

    分析:建表语句中明确表明 name 字段 NOT NULL,而此处的查询条件为 WHERE name IS NOT NULL,等价于不加这个条件,于是,查询等价于 SELECT * FROM staff,所以,全表扫描、不能使用索引

    3 结论

    对于已经有 NOT NULL 修饰的字段来说,不要再使用 IS NULL 或者 IS NOT NULL 来作为查询条件,没有意义。

  • 相关阅读:
    注意身体
    用生命去战斗
    来到华师,一切清零
    linux fork()函数 转载~~~~
    小端大端
    位域
    内存泄漏(memory leak)和内存溢出
    stack,heap的区别
    内存管理简便复习总结
    虚函数&&虚继承
  • 原文地址:https://www.cnblogs.com/cyhbyw/p/8832357.html
Copyright © 2011-2022 走看看