喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 30  1/3  1  2  3  > 
     
标题: [原创] 关于select ... where 的小技巧  
 
seakingx
金牌会员
Rank: 6Rank: 6


UID 75142
精华 0
积分 1189
帖子 801
金钱 663 喜悦币
威望 0
人脉 526
阅读权限 70
注册 2006-6-18
来自 海口
状态 离线
关于select ... where 的小技巧

大家在写sql 语句的时候, 如果是 select .. where 类型的语句, 有注意到条件的前后顺序吗?我今天做个小实验。
比如查询地址里 包含“海口市”及“振兴路” 两个关键字的数据, 一般时候可能会用
select *  from dm_addr where addr like '%海口市%' and addr like '%振兴路%'  的形式,但其实这种查询效率不高,原因在于条件的前后顺序。以下是测试结果

mysql> select count(1) from dm_addr where addr like '%振兴路%' and addr like '%海口市%';
+----------+
| count(1) |
+----------+
|       96 |
+----------+
1 row in set (0.82 sec)

mysql> select count(1) from dm_addr where addr like '%海口市%' and addr like '%振兴路%';
+----------+
| count(1) |
+----------+
|       96 |
+----------+
1 row in set (0.91 sec)


我做了很多次查询
where addr like '%海口市%' and addr like '%振兴路%' 总是比 where addr like '%振兴路%' and addr like '%海口市%'
慢,原因是查询是先处理第一条件,然后在处理第二个条件,先查询出所有 包含“海口市”的记录,再在这些记录中查询包含"振兴路" 的记录。 对于地址情况, 包含“海口市”的记录可能大于"振兴路" 的记录,我做测试的表有2万条数据, 已经有大概0.1s的差别。如果碰到大数据,这个差别会更大。
按以上的分析结果, 我们写SQL语句的时候, 对于select ...where ... 类型的语句,应该把查询结果范围小的条件放在前面,查询范围大的条件放在后面,这样会提高效率。

对于OR的情况:
测试如下:

mysql> select count(1) from dm_addr where addr like '%海口市%' or addr like '%振兴路%';
+----------+
| count(1) |
+----------+
|    39168 |
+----------+
1 row in set (0.84 sec)
mysql> select count(1) from dm_addr where addr like '%振兴路%' or addr like '%海口市%';
+----------+
| count(1) |
+----------+
|    39168 |
+----------+
1 row in set (0.95 sec)


OR语句的处理过程是这样, 对于每一条地址, 逐个分析条件,如果符合第一个条件,就不做第二条件的判断,那么我们应该把容易做判断的条件放在前面, 比如查询地址里 包含“海口市”或“振兴路” 个关键字的数据,按地址一般排法,XX市应该在XX路前。所以如果用第一种方式,那就效率高,判断有海口市就可以确认这行地址有效了。 所以在写OR类型的条件时, 应该把容易判断的条件写在前面。  

再做一个NOT ... OR .. NOT ... 测试,查询不包含 海口市 或者不包含 振兴路 的数据
mysql> select count(1) from dm_addr where addr not like '%海口市%' or addr not like '%振兴路%';
+----------+
| count(1) |
+----------+
|    38752 |
+----------+
1 row in set (0.92 sec)

mysql> select count(1) from dm_addr where addr not like '%振兴路%' or addr not like '%海口市%';
+----------+
| count(1) |
+----------+
|    38752 |
+----------+
1 row in set (0.86 sec)


因为每条数据都有海口市, 所以对于第一个查询,判断第一个条件都失败了, 都需要判断第二个。
对于第二个查询, 只要判断第一个条件为真就可以确定这个记录, 不需要判断第一个条件,
所以第二个查询效率高过第一个。

结论:对于select ... where ... 类型的语句。
对于OR条件, 需要把命中率高的条件放在前面。
对于AND条件,需要把条件限制范围小的条件放在前面。

希望这些实验能提高phper 的程序效率。以上测试是对于mysql 5.0 win 做的。好象记得ORACLE刚好相反, 是先判断最后的条件。




锐升科技
2007-3-14 12:02 PM#1
查看资料  Blog  发短消息  QQ  顶部
 
菜鸟也要有理想
中级会员
Rank: 3Rank: 3
一般会员



UID 65342
精华 0
积分 439
帖子 426
金钱 439 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-8-1
状态 离线
[推荐阅读] phper jsper 都可以 求一不错的公司(待遇丰富)
尽量多的where可以缩小范围



BLOG:http://www.kk.la
2007-3-15 06:57 AM#2
查看资料  发短消息  顶部
 
dreamblaze
高级会员
Rank: 4
administrator


UID 78956
精华 0
积分 989
帖子 1003
金钱 863 喜悦币
威望 0
人脉 126
阅读权限 50
注册 2006-8-24
来自 福州
状态 离线
[推荐阅读] 求一个mysql查询
成天用的东西倒没有去想过这个东西,学习了,多谢LZ
2007-3-16 06:48 PM#3
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 晕死,大家帮忙看看,这是什么病毒干的,应该怎么清除
数据库条件,匹配时由少至多。



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2007-3-16 09:26 PM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
seakingx
金牌会员
Rank: 6Rank: 6


UID 75142
精华 0
积分 1189
帖子 801
金钱 663 喜悦币
威望 0
人脉 526
阅读权限 70
注册 2006-6-18
来自 海口
状态 离线
[推荐阅读] phper求职[广东省内]
感谢qh663 版主 的奖励及回复关注的phper。

BTW,好象没多少人关注 SQL语句的问题...

[ 本帖最后由 seakingx 于 2007-3-16 09:30 PM 编辑 ]




锐升科技
2007-3-16 09:26 PM#5
查看资料  Blog  发短消息  QQ  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4934
帖子 1700
金钱 4924 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 一个ajax的问题
原来如此,看来很有学问



在场外支持奥运.....
2007-3-17 12:09 AM#6
查看资料  访问主页  发短消息  QQ  顶部
 
fcicq
新手上路
Rank: 1
初级会员



UID 24467
精华 0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8
来自 fcicq.net
状态 离线
[推荐阅读] 刷新问题
早就该玩全文的了...




2007-3-17 02:04 PM#7
查看资料  访问主页  Blog  发短消息  顶部
 
Phzzy
中级会员
Rank: 3Rank: 3
中级会员


UID 64065
精华 0
积分 298
帖子 296
金钱 298 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2005-5-11
来自 湖南TO北京
状态 离线
[推荐阅读] php实现伪静态化页面
good
2007-3-19 10:25 PM#8
查看资料  访问主页  发短消息  顶部
 
henanren
注册会员
Rank: 2
中级会员



UID 64137
精华 0
积分 197
帖子 386
金钱 29 喜悦币
威望 0
人脉 168
阅读权限 20
注册 2005-5-16
状态 离线
[推荐阅读] 房子真难找
好文章,很实用!
多谢·!正在用上!
2007-3-23 01:31 AM#9
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
刀鱼
版主
Rank: 7Rank: 7Rank: 7
好好做人,认真做事


UID 67208
精华 0
积分 677
帖子 822
金钱 677 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2005-12-15
来自 北京
状态 离线
[推荐阅读] 中关村附近求PHPER合租
不错,不错.



有项目需求,请联系:daoyu_06@126.com.
2007-3-23 11:53 AM#10
查看资料  Blog  发短消息  QQ  顶部
 30  1/3  1  2  3  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.026451 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP