前几天,一个朋友找到我,说一个SQL性能有问题,看看能不能优化,下面为过程:
雪豹 9:35:10
在吗
兰花岛主 15:07:39
忙忘了,有事儿?
雪豹 15:07:49
嗯
雪豹 15:07:54
数据库优化问题
兰花岛主 15:08:04
哦,你说。
雪豹 15:09:09
select distincta.suite_no,b.bd_nm,b.crt_date from (select suite_no from all_suite where cus_id =1)a left join
(select b.suite_no,b.bd_nm,b.crt_date from building b,customer c where c.cus_no=b.cus_no
and c.cus_serial='75806001113513'and b.back_date is null ) b on b.suite_no=a.suite_no;
雪豹 15:09:35
雪豹 15:09:58
如果数据在千万级别时候 会很慢
雪豹 15:10:35
有没有更好写法那
兰花岛主 15:10:58
哪个是千万级啊?
雪豹 15:11:10
building表
兰花岛主 15:11:25
customer呢?
雪豹 15:11:26
clustomer表很小
雪豹 15:11:36
在万条数据
雪豹 15:12:00
All_suite 这个表也是几万条数据
兰花岛主 15:13:38
你这个building表上的索引呢?
兰花岛主 15:13:40
我看看?
雪豹 15:15:10
building_idx1(bd_nm,area_id,cus_no,back_date,suite_no)
building_idx2(crt_date)
building_idx3(back_date)
building_pkey(sid)
雪豹 15:16:27
building的索引是否可以在优化一下
兰花岛主 15:16:36
这个列的选择性怎么样?
兰花岛主 15:16:48
也就是重复值多不?
雪豹 15:17:12
crt_date 不多
兰花岛主 15:17:42
不是这个,cus_serial
雪豹 15:17:57
area_id, cus_id, suite_no 这个几个重复值多
雪豹 15:18:27
这个没有重复
雪豹 15:18:30
都是唯一的
雪豹 15:18:44
这个是customer的表里吗
雪豹 15:18:48
他不是索引
兰花岛主 15:19:17
最终结果多少?
雪豹 15:19:37
查询出来数据吗
兰花岛主 15:19:51
对,结果集。
雪豹 15:21:22
每一个cus_serial 查询所有对应的all_suite所有房间 对应最后入住人员
雪豹 15:21:52
这个房间个数不会多
兰花岛主 15:22:29
一个cum_serial大概对应多少个customer?
兰花岛主 15:23:38
大概?
雪豹 15:23:57
一对一
兰花岛主 15:24:21
一个cus_serial对应一个customer?
兰花岛主 15:25:38
building_idx1这个索引列太多了。
雪豹 15:26:02
可以删除
雪豹 15:26:37
保留几个索引
兰花岛主 15:26:54
不用,单独在cus_no上建个索引吧。
兰花岛主 15:27:03
现在多久出结果?
雪豹 15:28:01
30s左右
兰花岛主 15:28:12
嗯。
兰花岛主 15:28:39
按照我说的见个索引吧,估计不会超过1s
兰花岛主 15:28:44
建。
雪豹 15:29:10
ok
兰花岛主 15:29:16
这样的话,你这个sql优化的空间还是比较大的。
兰花岛主 15:29:48
应该在最多几百ms出结果。
兰花岛主 15:29:53
优化好了的话。
雪豹 15:32:57
是的
雪豹 15:33:04
0.5秒
雪豹 15:33:22
比以前快了
兰花岛主 15:34:11
你刚才这个0.5s,是按照我说的方法建索引后的吗?
雪豹 15:34:25
建索引后
雪豹 15:34:37
是的
兰花岛主 15:34:51
哦。
兰花岛主 15:35:12
其他,不太了解你那边数据的情况,不太好精细优化。
兰花岛主 15:35:44
应该还能快。
雪豹 15:36:34
好的
雪豹 15:36:36
我看看
兰花岛主 15:37:16
比如:另外两个表的索引
雪豹 15:37:31
嗯
兰花岛主 15:37:43
那个全表扫描,虽然表小,但对 0.5s,应该也是不小的比例。
雪豹 15:37:55
明白了
兰花岛主 15:38:04
对吧。
雪豹 15:41:30
优化到0.18秒了
雪豹 15:44:52
0.07秒
兰花岛主 15:45:00
All_suite?
兰花岛主 15:45:07
嗯,这就差不多了。
兰花岛主 15:45:20
几十ms
雪豹 15:45:28
All_suite suit_no 做成索引了
雪豹 15:45:40
这回差不多了
兰花岛主 15:45:44
嗯,差不多了。
至此,对方还算比较满意,性能也有了大幅提升,鉴于多方面因素,对以上图文进行了必要处理,记录于此,各位也可以多想想看,是否还有更优的办法或其他思路,共勉。