首页
学习
活动
专区
圈层
工具
发布

必知必会——关于SQL中的NOT IN优化

复杂性源于以下事实:NULL可以理解为“未指定,可能是任何东西”,因此SQL的观点是,它无法知道NULL是否等于一个值或“东西”。...我可以将NOT IN更改为IN NOT TRUE: ? 这将让IN返回FALSE或UNKNOWN的房屋通过;因此,A和B会如我所愿地通过。 “ NOT IN(子查询)”也会发生相同的问题。...如果我做两次重写中的任何一个,我就会以某种方式向MySQL声明我希望NULL是我的NOT IN的明确匹配项。另一个好处是,这还使MySQL可以更“积极地”进行优化。...RAND()返回0到1之间的数字;ROUND()*5将其舍入为0到5之间的整数;0到4获得真实的能源,而5获得NULL(因为在CASE中未指定5)。...得出的结论是:当使用NOT IN时,如果无法避免使用NULL,请确认NULL的行为,如果不符合预期,请考虑“不正确或不存在”的替代方案。 感谢您使用MySQL!

5.6K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从一个翻页查询说起

    DEFAULT '0' COMMENT '经验值', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP...对于MyISAM, 因为我们要取的数据量巨大,而所选的列为*, 无法被索引数据覆盖(索引中只有id),此时mysql认为按索引遍历取数据很可能引发大量磁盘随机读事件,效率可能还不及将所有数据直接读入,再排序...我们将sql中的offset减少一个数量级,改为20w, 在MyISAM下执行,只要0.05s。...将选列改为* select * from user order by exp limit 2000000, 10; 执行时间44.46s! explain可以看到,使用了filesort。...如果你的数据库主键是连续的,就更方便了,sql可以改为: select * from user where id > 2000000 and id<=2000010 order by id limit

    73620

    MySQL数据库监控软件lepus使用问题以及解决办法

    问题1:php页面无法连接数据库 直接使用php程序执行php文件,可以连接mysql,但是在httpd中同样的php页面无法连接mysql。...null ; Query OK, 0 rows affected (0.03 sec) Records: 0  Duplicates: 0  Warnings: 0 修改mysql_slow_query_review_history...执行:select sleep(14)有时候无法在web界面查询到。 原因:有时候pt-query-digest产生的结果中db_max为NULL,导致查询不出来。...这个字段安装的原始数据库是NOT NULL,但是在NOT NULL的情况下pt-query-digest有时会插入NULL数据,导致报错。所以修改为了NULL。...修改为NULL后,web界面中查询时使用的PHP程序的SQL语句有问题,没有考虑NULL的情况,导致查询不出来这部分数据。

    2.1K31

    数据库技术:MySQL 基础和 SQL 入门,单表、约束和事务

    category 表改为 category1 RENAME TABLE category TO category1; -- 将 category 表的字符集 修改为 gbk alter table...,NULL,NULL); Update Data -- 不带条件修改,将所有的性别改为女,慎用 UPDATE student SET sex = '女'; -- 带条件的修改,将 sid 为 3 的学生...,性别改为女 UPDATE student SET sex = '女' WHERE sid = 3; -- 一次修改多个列, 将 sid 为 2 的学员,年龄改为 18,地址改为北京 UPDATE...0, 5; -- 查询 emp 表中从第 4 条开始,查询 6 条 # 起始值默认是从 0 开始的 SELECT * FROM emp LIMIT 3, 6; -- 分页操作:每页显示 3 条数据...违反约束的不正确数据,将无法插入到表中。 Primary Key -- 主键约束 主键约束是不可重复的、唯一的、非空的,用来表示数据库中的每一条记录。

    1.9K20

    企业面试题|最常问的MySQL面试题集合(二)

    优化长难的查询语句 一个复杂查询还是多个简单查询 MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多 使用尽可能小的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的...在应用层做关联更容易对数据库进行拆分。 查询效率会有大幅提升。 较少冗余记录的查询。...BY时加ORDER BY NULL,MySQL不会再进行文件排序。...0,确保表中num列没有null值,然后这样查询:select id from t where num= 3.应尽量避免在 where 子句中使用!...如下面语句将进行全表扫描: select id from t where num=@num可以改为强制查询使用索引:select id from t with(index(索引名)) where num

    2.5K20

    MySQL8.0新特性--函数索引

    很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化。...1、 MySQL5.7 MySQL5.7版本中不支持函数索引,因此 遇到函数索引的时候需要进行修改,否则即使查询的字段上有索引,执行时也无法使用索引而进行全表扫描,数据量大的表查询时间会比较长。...Records: 0 Duplicates: 0 Warnings: 0 1.3 按时间查询 查询创建时间是2020-07-01那天的所有记录 mysql> select * from tb_function...不支持函数索引,所以需要修改SQL写法来实现走索引(或者使用虚拟列的方式),上述SQL可以修改为 mysql> select * from tb_function where create_time...Duplicates: 0 Warnings: 0 2.2 按时间查询 mysql> select * from tb_function where date(create_time

    97330

    Mysql索引失效的场景

    当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效; 2.复合索引未用左列字段,即不是使用第一列索引,索引失效; 3.like以%开头,当like前缀没有%,后缀有...key0 改为 key>0 or key0。)不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。优化方法:key0 改为 key>0 or key0。)...7.如果mysql觉得全表扫描更快时(数据少); 8. 在索引列上使用 IS NULL 或 IS NOT NULL操作。...对于复合索引,如果不使用前列,后续列也将无法使用,类电话簿。 like查询是以%开头 ?...3) 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引 只有在where语句出现,mysql才会去使用索引

    7.6K40

    索引失效高阶案例:从隐蔽场景到精准优化

    关键词​:索引失效;隐式转换;最左前缀;范围查询;or条件;函数索引大家好,我是小耶。上次讲了5种索引失效场景,评论区说“够用了,但还有更坑的吗?”有的。...索引失效的本质是:MySQL认为走索引的成本高于全表扫描,或者索引列被迫进行了变换(函数、类型转换等)。在高阶场景中,字符集不一致、排序规则差异、隐式的NULL处理等都会让优化器放弃索引。...若col允许NULL且查询大量出现ISNOTNULL,可考虑将该列设为NOTNULL或使用覆盖索引。2.4不等于(,!...解决办法是将索引改为(a,c)或者把b也加入查询条件(即使不用,也要占位?不,只能重建索引或改写查询)。更隐蔽的是:查询条件中a是范围查询时,其后的b即便在索引中也无法使用。...2.6MySQL8.0函数索引的误用MySQL8.0支持函数索引,如CREATEINDEXidxONt((LOWER(name)))。

    17410

    关于MySQL库表名大小写问题

    通过以上实验我们发现 lower_case_table_names 参数设为 0 时,MySQL 库表名是严格区分大小写的,而且表别名同样区分大小写但列名不区分大小写,查询时也需要严格按照大小写来书写...也可以将 lower_case_table_names 设为 1 来解决此问题,我们来看下此参数为 1 时的情况: # 将上述测试库删除 并将 lower_case_table_names 改为 1 然后重启数据库...这样会更易用些,程序里无论使用大写表名还是小写表名都可以查到这张表,而且不同系统间数据库迁移也更方便,这也是建议将 lower_case_table_names 参数设为 1 的原因。...如果你的数据库该参数一开始为 0 ,现在想要改为 1 ,这种情况要格外注意,因为若原实例中存在大写的库表,则改为 1 重启后,这些库表将会不能访问。...当实例中存在大写库表时,可以采用下面两种方法将其改为小写: 1、通过 mysqldump 备份相关库,备份完成后删除对应库,之后修改配置文件重启,最后将备份文件重新导入。

    9.3K32

    【MySql】基本查询

    - 1 row affected: 表中没有冲突数据,数据被插入 -- 2 row affected: 表中有冲突数据,并且数据已经被更新 发生主键冲突把插入操作改为更新操作 替换 -- 主键 或者 唯一键...= NULL 的结果是 NULL 等于,NULL 安全,例如 NULL NULL 的结果是 TRUE(1) !...的查询 为了演示,先创建一张表test: select * from test where name is null; order by排序 -- ASC 为升序(从小到大) -- DESC 为降序...LIMIT n; -- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...]...对查询到的结果进行列值更新 将孙悟空同学的数学成绩变更为 80 分 update exam_result set math=80 where name='孙悟空'; 将曹孟德同学的数学成绩变更为 60

    2K20

    一千个不用 Null 的理由

    很多人员都以为not null 需要更多空间,其实这不是重点。 重点是很多程序员觉得NULL在开发中不用去判断插入数据,写sql语句的时候更方便快捷。 2、是不是以讹传讹?...Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。...NULL值到非NULL的更新无法做到原地更新,更容易发生索引分裂,从而影响性能。...注意:但把NULL列改为NOT NULL带来的性能提示很小,除非确定它带来了问题,否则不要把它当成优先的优化措施,最重要的是使用的列的类型的适当性。...root@localhost:cygwin> select * from table_3 where user_name = null\G 0 rows in set Time: 0.002s mysql

    62330
    领券