1、IN操作符

用IN操作符写出来的SQL直观简单、易于理解。但是在where条件中使用IN操作符是低效的。例如下面这条查询语句:

SELECT *

FROM tab_a

WHERE id IN(

SELECT a_id FROM tab_b);

你认为它会怎么执行呢?先从tab_a表中遍历数据,然后拿每行数据的id字段去tab_b表中去查找,只要找到就把这行纳入查询结果。

大错特错!事实上,RDBMS会先执行第4行的子查询,把查出的数据保存到一张临时表中,再执行主查询,利用临时表中的数据去核对主查询的where条件是否成立。

这是IN操作符低效的主要原因,因为临时表是没有索引的,要核对当前数据行的id值在临时表中是否出现,必须遍历临时表。也就是说tab_b表中即使对a_id字段建了索引也是没有用的。

推荐方案是使用表连接:

SELECT tab_a.*

FROM  tab_a INNER JOIN tab_b

ON tab_a.id=tab_b.id;

或者使用EXISTS操作符:

SELECT *

FROM tab_a

WHERE EXISTS

SELECT *

FROM tab_b

WHERE tab_a.id=tab_b.a_id;

注意,NOT IN和IN存在类似的问题,也是无法利用表上的索引。

2、IS NULL和IS NOT NULL

值得一提的是,数据库是不索引空值的,也就是说即便你在一个字段上建立的索引,当针对这个字段进行查询时,还是需要遍历整张表。

3、LIKE

LIKE操作符用于模糊查询,通过使用通配符可以进行非常灵活的查询,但是如果运用不当则会造成索引失效从而影响性能。

例如,LIKE '%abc%'这种两头都带通配符的查询不会使用到索引,而LIKE 'abc%'会使用到索引来缩小查询范围,从而提高性能。

4、where条件中的函数

where条件中如果出现函数则索引会失效,例如下面的查询语句:

SELECT *

FROM tab

WHERE substring(name,1,3)='abc';

   where条件中队name字段进行了取子串的函数转换,这样,即便name字段上建了索引,这个索引在查询的时候也不会被用到。

对于这种情况,即便是下面这条语句,也比上面的那条要强得多:

SELECT *

FROM tab

WHERE NAME LIKE 'abc%'

5、where条件中表内字段相互交杂

   在where条件中,如果出现本表内的字段相互连接或比较,则字段上的索引是无法生效的,比如下面的语句:

SELECT *

FROM tab

WHERE name||gener = 'abcF'

   name和gender上即使有索引,也不起作用。

下面的语句也是类似的情况: 

SELECT *

FROM tab

WHERE age>score

age字段和score字段都是tab表的字段,相互比较,不会引用索引。

最新文章

  1. 某墙尼妹,用个Response.Filter来解决StackExchange.Exceptional中google cdn的问题
  2. 古典问题rabbit
  3. php utf-8字符转ascii字符
  4. Android笔记:四大组件
  5. IOS开发--仿制网易新闻
  6. Spring 实践 -拾遗
  7. Linux 下安装配置nginx及常见问题解答
  8. 使用ecshop电子商务系统的100个小问题
  9. Objective-C和Swift
  10. linux 下配置静态IP
  11. iOS开发-OC分支结构
  12. 让互联网更快,Server Push 特性及开启方式详解
  13. Redis之(二)数据类型及存储结构
  14. POJChallengeRound2 Tree 【数学期望】
  15. T-SQL :SQL Server系统数据库(二)
  16. Java 接口 Closeable
  17. mysql分区方案的研究
  18. Java学习笔记48(DBUtils工具类一)
  19. 自己写一个spring boot starter
  20. 一个困扰了我N久的bug , android.enableAapt2=false 无效

热门文章

  1. SQLite数据库入门教程
  2. ModSecurity CRS笔记[转]
  3. Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)
  4. 从零开始学android开发-字符如何转换整形 string 转化为int
  5. (DP6.1.2.1)UVA 147 Dollars(子集和问题)
  6. Graph(2014辽宁ACM省赛)
  7. Struts2 Action的访问路径
  8. 编程之linux与win区别
  9. 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)
  10. 读 Runtime 源码:对象与引用计数