连接查询是数据库操作中很常用的操作,也是最耗费资源的操作。提高连接查询的效率,对于整体的效率提高有很大的意义。实际使用发现连接操作确实需要做一些优化。
一、一些原则
看了一些网友的经验后,总结一下:
- 使用子查询减少连接的两张表的字段、记录数量。
- 建立视图,减少需要处理的字段、记录数量。
- 用于连接的字段建立索引。
- 连接方式优先选择内连接,外连接尽量不使用。
- 尽可能将记录少的表放在连接的左边,以减少先处理的记录数量。*
二、一些实践
需求,查询表1中的字段A和表2中字段B匹配的合并后的所有记录。
方案一:
方案一:
select wwz.cpa,wwz.epa,family.memberan,family.adate from family,wwz where wwz.[PN]=family.[pnraw] group by memberan
运行很慢,难以接受。因此,按照我的需求,选择了第2、3项进行了优化。
首先创建视图:
create view main_pn_cpa_epa as select cpa,epa,pn from wwz;
create view family_an_date_pnr as select memberan,adate,pnraw from family;
再建立索引:
create index index_family_pnr ON family(pnraw);
在此基础上可以使用:
方案二:
select cpa,epa,memberan,adate from main_pn_cpa_epa,family_an_date_pnr where main_pn_cpa_epa.[PN]=family_an_date_pnr.[pnraw];
方案三:
select cpa,epa,memberan,adate from main_pn_cpa_epa inner join family_an_date_pnr on( main_pn_cpa_epa.[PN]=family_an_date_pnr.[pnraw]);
测试
- 硬件环境:
- 处理器:Intel(R) Core(TM) i3 CPU M330 @ 2.13GHz 双核
- 内存:4.00 GB
- 软件环境:
- Python2.7
- Sqlite3
- 源表容量:
- 表1:10442记录,37字段
- 表2:8654记录,7字段
- 100次查询,并且取出
耗时对比
方案一 | 方案二 | 方案三 |
1000min+ | 15.21s | 15.59 s |
* 没有试过