mysql 中<4 OR >6的效率要大于 !=5?
迷茫
迷茫 2017-04-17 11:46:05
[MySQL讨论组]
SELECT help_category_id,`name`,parent_category_id,`url` 
FROM `help_category` 
WHERE help_category_id!=5

VS

SELECT help_category_id,`name`,parent_category_id,`url` 
FROM `help_category` 
WHERE help_category_id<=4 OR help_category_id>=6

附 !=5也能用上索引

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
PHP中文网

哥们,你标题中的结论和对explain的理解都是错的。

第一. 这两种写法几乎是等价的,不存在哪个性能更好

为什么说是几乎呢,因为help_category_id < 4 or help_category_id > 6比help_category_id!=5有可能少返回两条数据,少了help_category_id =4和help_category_id =6两条(如果这两条存在的话)

看截图,你加上了等号,那就是完全等价了,返回条数也是一样的。

你的表一共有1.5万行,少返回两行对性能的影响小到无法测量

第二. 截图中的两种写法都用不上fid字段上的索引

你大概是看到possible_keys里出现了fid,就以为用上索引了吧。

但,这个仅仅是possible,即有可能用上的索引,实际上有没有用上索引,你要看后面的key,key是NULL,说明没用上任何索引,再看前面的type是ALL,说明是全表扫描

第三. 也不是100%用不上索引,如果fid是primary key,就可以用上,两种写法都可以用上:

所以,要么都用不上索引,要么都用得上(视乎fid的索引类型),不存在哪个性能更好的问题

黄舟

个人认为,如果help_category_id字段有索引 <4 >6 这种方式是可以利用上索引的,但是 !=5 是用不了索引的

高洛峰

亲,help_category_id<4 AND help_category_id>6 可以直接被解析为False,当然快了。
题主已改问题,忽略我吧。

怪我咯

SELECT help_category_id,name,parent_category_id,url FROM help_category WHERE help_category_id between 4 and 6 and help_category_id!=5

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号