union 用于合并两个或多个查询结果,这些查询结果必须具备相同的列结构、相同的列顺序。
union:
select column_names from tablename
union
select column_names from tablename
union all:
select column_names from tablename
union all
select column_names from tablename
union与union all的区别在于UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
SQL在运行时先取出两个表的结果,再用排序空间进行排序并会掉删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而union all只是简单的将两个结果合并后就返回,这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,union all比union会快很多,如果确定两个表中不包含重复数据的话就用union all。
有些时候会不可避免的用到in与or进行查询。但使用时需要注意使用in或or查询会进行数据遍历,会影响查询效率。
SQL:
SELECT * FROM article WHERE article_category=11 ORDER BY article_id DESC LIMIT 5
优化此sql效率,建立索引:
create index idx_u on article (article_category,article_id);
in:
SELECT * FROM article WHERE article_category IN (2,3) ORDER BY article_id DESC LIMIT 5
or:
select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
此时已经做了列索引但查询效率依旧不高。
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
1.对于索引列来最好使用union all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
2.对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。
分享到:
相关推荐
在MySQL中,OR、IN和UNION ALL是三种常见的SQL查询操作符,它们在不同的场景下各有优劣,效率取决于多种因素,包括索引的存在、数据量、查询条件等。以下是对这些操作符效率的详细分析: 1. **OR操作符**: - 当在...
- **替代方案**:可以考虑使用UNION ALL来合并多个查询语句,如 `SELECT id FROM t WHERE num = 10 UNION ALL SELECT id FROM t WHERE num = 20`。 **4. 避免使用IN和NOT IN** - **注意事项**:使用IN和NOT IN可能...
in和not in操作符可以导致引擎放弃使用索引,而进行全表扫描,影响查询效率。可以使用between操作符来代替in操作符,例如:select id from t where num between 1 and 3。 6. 如果在where子句中使用参数,也会导致...
### 详细讲解提高数据库查询效率的实用方法 在IT领域,特别是对于数据库操作而言,提高查询效率是一项至关重要的技能。本文将围绕如何优化数据库查询展开,深入探讨多种实用技巧,并结合具体的示例来帮助读者更好地...
4. **谨慎使用OR连接条件**:使用OR可能会导致全表扫描,可尝试拆分为多个独立的查询,如使用UNION ALL。 5. **IN与NOT IN的使用**:尽量减少使用,尤其是对大量值的操作,可以考虑使用BETWEEN或比较操作符替换。 ...
1. **使用UNION替代OR**:如果可能,将`OR`查询改写为`UNION`或`UNION ALL`,这样每个子查询都可以独立地使用其对应的索引。例如: ```sql (SELECT * FROM table WHERE column1 = 'value1') UNION (SELECT * ...
### 处理百万级以上的数据查询提高效率的办法 在处理大量数据时,SQL查询的性能优化至关重要。本文将从多个方面介绍如何优化SQL查询,从而提高处理百万级以上数据的效率。 #### 1. 使用 `WHERE` 子句时避免使用 `!...
4. **谨慎使用`OR`连接条件**:使用`OR`可能导致全表扫描,应尽量改用`UNION ALL`或者多个单独的`WHERE`子句,每个子句对应一个条件。 5. **避免全通配符`LIKE`查询**:`LIKE ' %abc%'`这样的查询会导致全表扫描,...
使用in可以提高查询效率。 8. 删除重复数据 使用delete from语句删除重复数据,可以提高查询效率。 9. 避免使用耗费资源的操作 避免使用DISTINCT,UNION,MINUS,INTERSECT,ORDER BY等耗费资源的SQL语句。 10. ...
本文将围绕“数据库中数据查询优化”这一主题展开论述,结合给定文件中的内容,详细介绍多种实用的数据查询优化方法及案例。 #### 一、避免全表扫描 全表扫描是指在没有适用索引的情况下,数据库管理系统会逐行...
对于连续数值的查询,建议使用between来代替in,以便利用索引提高查询效率。 5. 在对已经建立索引的字符数据进行查询时,避免使用非打头字母进行like查询,因为这会导致索引失效。例如,like '%L%'将无法使用索引,...
- 使用“OR”也可能导致全表扫描,如`SELECT id FROM t WHERE num = 10 OR num = 20`,可以改写为`SELECT id FROM t WHERE num = 10 UNION ALL SELECT id FROM t WHERE num = 20`来提高效率。 #### 4. IN和NOT IN的...
在这种情况下,可以尝试用`UNION ALL`或`UNION`(必要时)来代替`OR`,但需注意`UNION ALL`不进行重复数据检查,适用于无重复数据的情况。 排序是另一个性能瓶颈。如果没有使用索引的排序字段,应尽量减少排序操作...
2. `UNION`、`IN` 和 `OR` 查询:`UNION` 和 `IN` 均能利用索引,`OR` 在新版 MySQL 中也可以,但`IN` 通常更高效,推荐使用 `IN` 代替 `OR`。 3. 负向条件查询:如 `!=`、`<>`、`NOT IN`、`NOT EXISTS`、`NOT LIKE`...
可以考虑将OR条件拆分为多个查询,用UNION ALL来合并结果。 5. **慎用IN和NOT IN**:这两个操作符也可能触发全表扫描。对于连续数值,优先使用BETWEEN。对于大范围的值集合,可以考虑使用临时表或子查询。 6. **...
=`或`<>`操作符,这些操作符可能导致全表扫描,而使用具体数值如`WHERE num = 10 OR num = 20`则更优,可通过UNION ALL进一步优化,减少查询次数。 ### 3. IN和NOT IN的优化 使用IN和NOT IN时,应注意它们可能触发...
7. **参数化查询**:避免在WHERE子句中直接使用参数,可以使用WITH(INDEX())指定索引以提高查询效率。 8. **避免表达式和函数操作**:在WHERE子句中避免对字段进行除法、乘法等运算或使用函数,这会导致索引失效。...
12. **EXISTS 优于 IN**:在某些情况下,使用 EXISTS 代替 IN 可以提高查询效率。 13. **考虑数据重复性**:如果索引列有大量重复数据,索引可能无法提供预期的性能提升。 14. **索引的数量与类型**:并非所有字段...