`
xiaoboss
  • 浏览: 651670 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MYSQL索引优化和in or替换为union all

 
阅读更多

使用UNION ALL代替OR,这不是绝对的。具体什么时候选择谁,需要看测试数据。

一个文章库,里面有两个表:category和article。category里面有10条分类数据。article里面有20万条。article里面有一个"article_category"字段是与category里的"category_id"字段相对应的。article表里面已经把 article_category字义为了索引。数据库大小为1.3G。

问题描述:
执行一个很普通的查询: SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5 。执行时间大约要5秒左右

解决方案:
建一个索引:create index idx_u on article (article_category,article_id);
SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5 减少到0.0027秒


继续问题:
SELECT * FROM `article` WHERE article_category IN (2,3) ORDER BY article_id DESC LIMIT 5 执行时间要11.2850秒。
使用OR:
select * from article
where article_category=2
or article_category=3
order by article_id desc
limit 5
执行时间:11.0777

解决方案:避免使用in 或者 or (or会导致扫表),使用union all 


使用UNION ALL:
(select * from article where article_category=2 order by article_id desc limit 5)
UNION ALL (select * from article where article_category=3 order by article_id desc limit 5)
ORDER BY article_id desc
limit 5
执行时间:0.0261

分享到:
评论

相关推荐

    MySQL中使用or、in与union all在查询命令下的效率对比

    在MySQL数据库中,进行数据查询时,我们经常需要使用到`OR`、`IN`和`UNION ALL`这些操作符。这些操作符在不同的场景下有不同的效率表现,但并不是像网络上普遍认为的那样,`UNION ALL`总是比`OR`和`IN`更快。实际上...

    MySql性能优化集合--满满的干货

    - **index_subquery**:用于替换特定形式的IN子查询,但适用于非唯一索引的情况。 - **range**:检索给定范围内的行,使用索引选择行。 - **index**:类似于ALL,但只扫描索引树。 - **ALL**:全表扫描,性能...

    mysql实战性能优化

    在MySQL中,优化是指通过合理地配置资源和调整系统参数,使得数据库能够更快地响应查询请求,同时尽可能减少资源消耗。优化的目标在于减少系统的瓶颈,降低资源占用率,并提高系统的整体响应速度。 #### 二、优化的...

    MySql5.6性能优化.docx

    - **unique_subquery**:用于优化 IN 子查询,替换为更高效的索引查找函数。 - **index_subquery**:类似 unique_subquery,但适用于非唯一索引的 IN 子查询。 - **range**:仅检索给定范围内的行。 - **index**...

    Mysql5.6性能优化

    - **理解优化的概念:** 首先明确什么是优化,即如何通过合理地分配资源和调整系统参数来提升MySQL的运行速度,同时减少资源消耗。 - **掌握查询优化方法:** 学习并运用各种技术来提高查询效率,确保数据的快速检索...

    mySql优化方法简单≈易学

    - **解决方案**:使用 `UNION ALL` 替换 `OR`,可以更高效地处理多个独立的查询。 **5. 避免使用 `LIKE` 开头的通配符** - **问题分析**:使用 `%` 开头的 `LIKE` 语句(例如 `LIKE '%abc%'`)通常会导致全表...

    mysql sql 百万级数据库优化方案

    4. **避免 `OR` 连接条件**:使用 `UNION ALL` 分开多个查询以保持索引利用率。 5. **谨慎使用 `IN` 和 `NOT IN`**:如果值是连续的,考虑使用 `BETWEEN`。对于大范围的 `IN` 查询,考虑转换为 `JOIN` 或 `EXISTS`...

    sql语句优化大全.docx

    union 和 union all 的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。union all 的前提条件是两个结果集没有重复数据。 8. 不使用 ORDER BY...

    30个mysql千万级大数据SQL查询优化技巧详解

    可以使用`UNION ALL`或多个独立查询结合`IN`来替代。 5. **谨慎使用IN和NOT IN**:对于连续数值,使用`BETWEEN`比`IN`更高效。同时,`IN`可能导致全表扫描,应尽量避免。 6. **避免模糊匹配%前缀**:`LIKE '%李%'`...

    SQL优化总结

    可以尝试用 UNION ALL 替换 OR 来提高查询效率,例如:`SELECT id FROM A WHERE num = 10 UNION ALL SELECT id FROM A WHERE num = 20`。 ### 7. IN 或 NOT IN 优化 - **IN 和 NOT IN** IN 和 NOT IN 也可能导致...

    SQL优化方案——性能优化

    **标题:** 应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用UNION合并查询:select id from t where num = 10 union all select id from t where num = 20。...

    老司机总结的12条 SQL 优化方案(非常实用).docx

    2. 用 IN 来替换 OR 低效查询:`SELECT * FROM t WHERE id = 10 OR id = 20 OR id = 30;` 高效查询:`SELECT * FROM t WHERE id IN (10,20,30);` MySQL 对于 IN 做了相应的优化,即将 IN 中的常量全部存储在一个...

    MySQL数据库21条最佳性能优化经验

    20. **避免在WHERE子句中使用OR操作**:OR可能导致MySQL无法使用索引,可尝试使用UNION ALL替换。 21. **定期检查和修复表**:使用`REPAIR TABLE`检查和修复可能出现的问题,如损坏的索引或数据。 以上是21条针对...

    数据库SQL优化大总结之 百万级数据库优化方案

    4. **谨慎使用OR**:在where子句中使用OR会阻止索引的使用,可以考虑使用UNION ALL代替,分开执行多个查询。 5. **IN与NOT IN的使用**:尽量避免在where子句中大量使用IN,尤其是与非索引字段结合时。对于连续数值...

    SQL语句优化

    6. **避免在WHERE子句中使用OR**:OR操作会导致索引失效,可以考虑使用UNION ALL或者重写查询结构。 7. **使用EXPLAIN分析查询计划**:通过EXPLAIN可以查看MySQL执行查询的详细步骤,帮助识别潜在的性能瓶颈,如全...

    开发中使用到数据库语句优化

    - 避免在`WHERE`子句中使用`OR`,可以考虑使用`UNION ALL`替代。 - 使用`JOIN`时,确保关联条件是索引,且数据量较小的一方作为驱动表。 3. **SQL语句重构**: - 避免在循环中执行单条SQL,改为一次性处理多条...

    MySQL学习笔记 ADY

    根据所提供的文件内容,以下是...这些知识点覆盖了MySQL的安装配置、基本概念、数据类型、表操作、索引、视图、触发器、查询、数据操作、运算符、函数以及存储过程和函数等方面,适合初学者学习和掌握MySQL的基本使用。

    当面试官问你mysql优化时..

    同时,避免在`WHERE`子句中使用`OR`,而是用`UNION ALL`来组合多个`SELECT`语句。 对于复合索引,确保查询条件包含索引的第一个字段,以保证索引的有效利用。索引的顺序应与查询条件匹配。小规模的表和不常使用的列...

    详解Mysql多表联合查询效率分析及优化

    在MySQL中,`INNER JOIN`和`CROSS JOIN`被视为等价,但通常推荐使用`INNER JOIN`以明确表示连接意图。连接条件通常在`ON`子句中指定。 3. **外连接(Outer Join)**:外连接分为左外连接(LEFT JOIN)和右外连接...

    1.总 面试题.pdf

    通过这些详细的解释,我们可以更深入地理解`StringBuilder`与`StringBuffer`的选择逻辑、MySQL数据库优化的最佳实践以及如何利用`EXPLAIN`工具来分析和优化查询性能。这对于提高应用程序的整体性能至关重要。

Global site tag (gtag.js) - Google Analytics