mysql 中 in/exists/not in/not exists/or的使用场景和效率对比
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
网上一堆博客在讨论mysql里面内置的关键字的效率问题,绝大部分都脱离了一定的前提条件就展开了论述,这是不科学的。
首先我们必须确定在mysql的哪个版本当中来讨论。这一点是因为mysql是在不断的快速更新当中的,大家都知道5.6的版本和之前的版本之间质的飞跃可以说是
里程碑式的。当然硬件环境也要保持一致。存储引擎也必须一致。该使用索引的地方使用索引,联合索引用的适当效率会很高,覆盖索引。
以下都是以InnoDB作为存储引擎做比较的。
讨论in VS or
在当前版本中(5.6.x),
1 数据量较小的情况下,效率相差无几。
2 数据量较大的时候,in 效率平稳降低,or 急剧降低。
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
讨论in VS exists
in 与exists的本质: in 是两张变的hash连接,exists是外层变loop循环,每次循环操作内层表。
在当前版本中(5.6.x),
1 当数据量较小的时候,使用任何一种效率都不受影响。
2 当数据量较大的时候 分为两种情况
1) 子查询的结果集较小,这时候使用in的效率比较好
2) 子查询的结果集较大,这时候使用exists效率好。
3)能用between的地方就不要用in
讨论not in VS not exists
在当前版本中(5.6.x),
not exists 的效率始终比not in 要好。
可以用distinct就不要用group by
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
注意mysql的版本,可能等下一个大版本更新的时候,一切都可能会改变。
分页的时候 尽量如此优化
select * from page where id between 1000000 and 1000010;
相关推荐
在MySQL数据库中,exists和in是两种常用的子查询比较方式,它们在性能上有显著的差异。exists使用方式是检查子查询结果中是否存在匹配的记录,它会根据outer表的记录逐条进行比较,因此outer表的记录越少,exists的...
- **优化IN和NOT IN的使用**:对于连续数值,使用`BETWEEN`而非`IN`。 - **LIKE操作的优化**:使用前缀匹配而不是后缀匹配可以提高查询速度。 - **参数化查询**:使用参数化的查询可以避免全表扫描。 - **避免在...
`NOT IN`和`NOT EXISTS`之间,通常推荐使用`NOT EXISTS`,因为它的逻辑更清晰,且在某些情况下效率更高。 分页查询的优化也很关键。传统的`LIMIT`分页在大数据量下表现不佳,可以采用预计算中间结果的方式提高效率...
- **慎用 IN 和 NOT IN**:这些操作符可能导致全表扫描,尤其是在处理大量数据时。例如: ```sql SELECT id FROM t WHERE num IN (1, 2, 3); ``` 对于连续数值范围,建议使用 `BETWEEN` 替代 `IN`: ```sql ...
5. **优化`IN`和`NOT IN`的使用**:`IN`和`NOT IN`可能导致全表扫描,尤其是在列表较长的情况下。可以考虑使用`BETWEEN`替代`IN`,例如将`SELECT id FROM t WHERE num IN (1, 2, 3)`改为`SELECT id FROM t WHERE num...
- **问题分析**:如果在 `WHERE` 子句中使用参数(例如 `@num`),MySQL 在编译时无法确定索引是否适用。 - **解决方案**:显式指定索引使用,如 `WITH(INDEX(索引名))`。 **8. 避免对字段进行表达式操作** - *...
7. **避免在 `WHERE` 子句中使用参数**:如果可能,使用索引提示 `WITH(INDEX(索引名))` 强制使用索引。 8. **避免表达式操作**:不要在 `WHERE` 子句中对字段做除法等运算,而是将运算结果提前计算。 9. **避免...
### MySQL性能优化集合 #### 一、MySQL优化概述 MySQL作为一种广泛使用的开源关系型数据库管理系统,在数据处理方面表现优秀。...在实际应用中,还需要根据具体的业务场景和数据特征来综合考虑各种优化策略。
- **Oracle与MySQL的成本对比**:从许可费用、硬件成本、维护成本等多个角度比较Oracle和MySQL,MySQL通常具有更低的总体拥有成本(TCO)。 - **开源优势**:MySQL作为一款开源数据库系统,其免费版提供了足够的功能来...
5. **谨慎使用IN和NOT IN**:避免在WHERE子句中使用这些操作符导致全表扫描。对于连续数值,优先使用BETWEEN。 6. **LIKE操作符优化**:%前缀匹配可使用索引,但%后缀匹配则不行。考虑使用全文检索以提高模糊查找...
6. **谨慎使用IN和NOT IN**:对于连续数值,使用`BETWEEN`代替;对于大量值,考虑使用子查询或临时表。 7. **避免使用参数和局部变量**:在`WHERE`子句中直接使用参数,而不是通过局部变量,以允许SQL引擎优化索引...
2. **避免SELECT ***:避免在查询中使用SELECT *,因为这会增加CPU、IO、内存和网络带宽的消耗。应只选择需要的字段,这也有助于提高覆盖索引的利用率。 3. **限制数据量**:当只需要一条数据时,使用`LIMIT 1`可以...
- **3.10 查询条件使用not in、not exists时**:如果查询条件使用 `NOT IN` 或 `NOT EXISTS`,并且涉及的字段不是主键,则索引可能会失效。 - **3.11 当查询条件涉及到order by、limit时**:如果查询中包含 `ORDER ...
CREATE [OR REPLACE] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT 'comment'] DO sql_statement ``` 其中: - **IF NOT EXISTS**: ...
5. **IN与NOT IN的使用**:尽量减少使用,尤其是对大量值的操作,可以考虑使用BETWEEN或比较操作符替换。 6. **LIKE操作符与全文本搜索**:LIKE '%abc%'这样的模糊查询会进行全表扫描,对于连续的数值使用BETWEEN更...
7. **避免使用参数和表达式**:在`WHERE`子句中使用参数或对字段进行表达式运算会阻止索引使用,应尽量改写为直接的等值比较。 8. **避免函数操作字段**:例如`SUBSTRING`,应使用`LIKE`来替换,以利于索引的使用。...
以上只是MySQL基础命令的一部分,实际使用中可能需要结合具体的业务需求进行更复杂的查询和操作。MySQL的灵活性使得它能适应各种场景,从简单的个人项目到大型企业应用都有广泛的应用。熟练掌握这些基础命令,将有助...
- 避免在查询中使用`IS NULL`或`IS NOT NULL`,这些操作无法利用索引,可能导致性能下降。可以尝试用`WHERE column = some_value`或`WHERE column <> some_value`结合`NULL`的逻辑特性来替换。 2. **充分利用索引*...
对于NOT IN和NOT EXISTS,推荐使用NOT EXISTS,它在逻辑上更安全,且在某些情况下性能更优。 10. **分页查询优化**:避免直接使用`LIMIT`进行大量数据的分页,而是根据上一页的最大ID来设定下一页的起始位置,这样...
3. **避免使用NOT IN和IN运算符**:可以考虑使用EXISTS或NOT EXISTS替代,以利用索引来提高效率。 三、SQL语句优化策略 1. **减少JOIN操作**:JOIN操作可能导致大量数据的交换,尽量通过优化数据库设计,减少JOIN的...