数据多个表关联查询时,由于表之间的连接关系(内连接、外连接、交叉连接),导致数据库服务器常常从几万条甚至更多的数据记录中查找符合条件的记录,如果sql查询语句设计不好查询的复杂度就会直线上升,甚至是指数级上升,导致查询时间长甚至失去相应,这里讲两种从sql语句优化查询的方法。
1.把外连接变成交叉连接或内连接(对不起,在写改良例子的时候发现这种方法并不能改善查询的速度,这是一个错误):
我们建三个表分别是:temple、bonze、和woodfish。
temple表示庙宇,它的字段有:
temple_id int
temple_name varchar(50)
location varchar(50)
build_date datetime
temple_id是主键,设为自增;temple_name是庙宇名;location是位置,就是寺庙的地址;build_date是建庙时间。
bonze表示和尚,它的字段有(出家人四大皆空,这些字段够了,呵呵):
bonze_id int
temple_id int
bonze_name varchar(50)
register_time datetime
bonze_id是主键,设为自增;temple_id表示这个和尚属于哪个寺庙,对应寺庙的temple_id,对于没有寺庙的流浪和尚这里暂时不考虑(写这篇文章主要是告诉一些大寺庙,他们可以采用软件管理的方式来管理寺庙,如果他们看到了我这篇文章可能会找我开发一个开发软件也未定,至于流浪和尚是不太可能的了,所以不考虑他们,呵呵,罪过、罪过);bonze_name是和尚名字,和尚本没有名字就叫法号吧;register_time是注册时间,现在做个和尚挺不容易的,难度差不多赶上高考上榜了,所以要一个注册时间。
woodfish表示木鱼,呵呵,木鱼的英文实在不会写,只好直译了,哪位兄弟姐妹知道了告诉我一下。木鱼的字段有:
woodfish_id int Unchecked
bonze_id int Unchecked
woodfish_num varchar(50) Checked
woodfish_id是主键,设为自增;bonze_id表示这个木鱼属于那个和尚,不属于任何和尚的木鱼我们也暂时不考虑,那些房子仓库就可以了,不用编号什么的;woodfish_num表示木鱼编号。
我们建立表的关系图如下(微软的SqlServerManagement应该提供可以把关系图转换成图片的功能,我还要photoshop来截图):
图1 数据关系图
相当简单的一个数据库。我们假设有些寺庙可以没有和尚,这就是荒庙,看过武侠小说的兄弟们应该可以了解的。和尚可以没有木鱼,可能太穷了,买不起,也可能太懒了,懒得敲。当然有些和尚也可以拥有几个木鱼,可能准备收徒弟的时候送个木鱼做见面礼什么的。
现在我们插入一些数据。一下数据仅为测试使用,并无意冒犯任何寺庙和庙里的高僧。
temple的数据为:
temple_id |
temple_name |
location |
build_time |
1 |
少林寺 |
河南省登封市嵩山 |
1900-2-2 0:00 :00 |
2 |