一次sql语句统计分析比较记录

       来在看sql的一些东西,将一些步骤记录下来。

       1. 使用explain来检查查询走索引的情况

       2. 将数据库的profile功能打开

           select @@profiling;

          如果profilling为1,就不用打开了,如果不为1,就打开:

         set profiling = 1;

       3. 使用show profiles来查看进去执行的各个query

       4. 使用show profile all for query xxx. 这个里面的xx就是你上面的query的id

      下面我们来看下我这次排查的一个过程:

       首先下来看下表结构,这个地方就简略的写下 :

       假设 有一张表,表名:GWFP_PROCESS_INFO,假设只有这两列,其中CREATE_USER和别的两个字段建立了联合索引。

表结构:  
  PROCESS_ID int  
   CREATE_USER varchar(20)  

primary key PROCESS_ID

key CREATE_USER_INDEX(xxx,CREATE_USER,yyyy)


有以下数据:  
  [PROCESS_ID] [CREATE_USER ]  
  001 zhangsan
  002 zhangsan
  003 lisi
  004 wangwu

要求写一个查询语句,只显示[name]有重复的数据,没有重复的不显示出来。  

这个地方sql的话,有两种写法,都要用子查询,一种是走in

select PROCESS_ID from GWFP_PROCESS_INFO where CREATE_USER in (select CREATE_USER from GWFP_PROCESS_INFO  group by CREATE_USER  having count(CREATE_USER) > 1);

 另外一个是使用exists子查询:

  select PROCESS_ID from GWFP_PROCESS_INFO g1 where exists (select 1 from GWFP_PROCESS_INFO g2  where g1.CREATE_USER = g2.CREATE_USER and g1.PROCESS_ID != g2.PROCESS_ID);

 

   我们来看下explain的效果:



 

数据总量如下:



 我们明显看到这两个没有大的区别。

 这也不写profile的结果了,两个也差别不大,所以exists和in感觉在这种情况下没有什么区别,就放心了。

   

猜你喜欢

转载自asialee.iteye.com/blog/1981558