首页 新闻 会员 周边 捐助

SQL中不等于的条件如何使用索引

0
悬赏园豆:20 [已解决问题] 解决于 2024-02-05 09:45

MySQL数据库,定义了索引列
但是查询必须要加上这个列不等于空这个条件
!= ''
is not null
都会使索引失效
数据表记录有上千万条,所以查出来要20秒
如何使用索引解决这个问题呢?
请大佬帮忙解决

teagueli的主页 teagueli | 初学一级 | 园豆:75
提问于:2019-04-22 09:25
< >
分享
最佳答案
1

where子句中查询的列执行了 “is null” 或者 “is not null” 或者 “<=> null”,是会走索引的,
依据官方文档:https://dev.mysql.com/doc/refman/5.6/en/is-null-optimization.html
我有疑问的是,你的索引是不是建立的不合适啊?多个条件,建立一个包含这个字段的复合索引试下。

另外,强烈建议改表,所有字段设默认值,然后将数据一次性导过去;(不建议用触发器,不利于后期维护)。

收获园豆:20
Eric-Lee | 菜鸟二级 |园豆:228 | 2019-04-22 15:22

你这都是等于 如果不等于呢 != 这种 怎么优化才能走索引呀

_小北Lee | 园豆:200 (初学一级) | 2020-05-06 19:13

@_小北Lee: 换成范围查询 > or < 这样查询

honkkki | 园豆:200 (初学一级) | 2020-08-24 23:21

@_小北Lee: 最好用建一个联合索引 让它直接走覆盖索引这样更快

honkkki | 园豆:200 (初学一级) | 2020-08-24 23:21
其他回答(3)
0

不要插入null,插入一个特殊字符可以吗?把sql改成两部分,一部分是小于这个特殊字符的,另一部分是大于这个特征字符的,然后再union在一起。试试速度怎么样

会长 | 园豆:12463 (专家六级) | 2019-04-22 09:46

可以不修改默认值实现吗
很多地方都用到这个字段,这里一改就都得动了
而且是二次开发,原来程序哪里用到都不清楚,包括底层封装的dll也有用
可以添加索引或者新建字段

支持(0) 反对(0) teagueli | 园豆:75 (初学一级) | 2019-04-22 10:26

@寻找薛定谔的猫: 这样的话我觉得可能没救了,都不可以动表。

要不你新建一个表,在新建表里重新设置索引,把字段设置为非空,把旧数据都导入进去了,再写个触发器,同步更新或插入到新表里,然后你在新表上操作

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2019-04-22 10:30

@会长: 这个字段值存放数字,且不会为负数。我判断这个字段是否大于零可以吗?大于或小于应该可以使用索引吧。就是有null的值,null>0的结果还是null。实在不行我把默认值为null的都设置为空字符。

支持(0) 反对(0) teagueli | 园豆:75 (初学一级) | 2019-04-22 14:43
0

添加一个字段,用这个字段保存那个字段是否为 NULL 的信息,查询时使用这个字段

dudu | 园豆:30436 (高人七级) | 2019-04-22 10:34
0

只能改表了,使用不等于就用不到索引。

是小毛吖 | 园豆:314 (菜鸟二级) | 2019-04-22 10:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册