mysql or优化查询_mysql or条件查询优化

当使用or的时候是不会用到索引的

explain SELECT * FROM aladdin_resource WHERE state = 1 OR state = 2;

解决办法就是用union替换or

select * from aladdin_resource where state=1 union select * from aladdin_resource where state=2;

union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在中,使用OR查询可能导致全表扫描和查询速度慢。为了优化这种情况,可以考虑以下几个方案: 1. 使用UNION查询:可以将多个OR条件拆分为多个子查询,然后使用UNION将结果合并。这样可以避免全表扫描,提高查询效率。例如,将原始SQL改写成使用UNION的形式: ``` SELECT `pwd_flag`,`username`,`uid`,`email`,`user_status` FROM `member` WHERE (`user_status` >= 0 and `email_status` = 0 and `username`=@search) UNION SELECT `pwd_flag`,`username`,`uid`,`email`,`user_status` FROM `member` WHERE (`user_status` >= 0 and `email_status` = 0 and `email`=@search) UNION SELECT `pwd_flag`,`username`,`uid`,`email`,`user_status` FROM `member` WHERE (`user_status` >= 0 and `email_status` = 0 and `phone`=@search) LIMIT 1; ``` 这样可以将原始的OR查询拆分为三个子查询,并使用UNION将结果合并。这种方式可以提高查询效率。 2. 使用索引:为了进一步优化查询性能,可以为涉及到的字段(`username`、`email`和`phone`)添加索引。通过为这些字段添加索引,可以加快查询速度,避免全表扫描。 ``` ALTER TABLE `member` ADD INDEX `idx_username` (`username`); ALTER TABLE `member` ADD INDEX `idx_email` (`email`); ALTER TABLE `member` ADD INDEX `idx_phone` (`phone`); ``` 这样可以在查询时利用索引进行快速匹配,提高查询效率。 3. 优化数据模型:根据业务需求,考虑对数据模型进行优化,例如将经常一起查询的字段放在一个表中,避免多表关联查询;或者将一些不常用的字段拆分到其他表中,减少查询的数据量。 综上所述,通过使用UNION查询、添加索引和优化数据模型,可以对MySQL中的OR查询进行优化,提高查询效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mysql or查询优化](https://blog.csdn.net/liujihaozhy/article/details/50629496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值