一次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感觉在这种情况下没有什么区别,就放心了。