MySQL百万级数据表or查询优化

MySQL百万级数据表or查询优化

解决思路

使用union all代替or查询,也就是说把要查询的字段分别做查询,将结果使用union all连接在一起,这样单次查询可以用到索引,效率大大提高
先看一下分析结果

原sql语句or条件查询

EXPLAIN
SELECT * FROM `qipa250_activity_map` where path ='pages/products/products' or agent ='pages/products/products'

在这里插入图片描述
索引失效,type为all扫描全表

修改为:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值