您的位置:首页 > 数据库 > MySQL

MySQL子查询优化实例

2013-10-25 15:41 411 查看
[b]优化:子查询改写成关联查询[/b]


线上遇到问题,查询较慢,如为对应SQL的查询执行计划:

localhost.user>explain EXTENDED select  uid from bar_user_6 where bid='9279' and uid in (SELECT a_uid FROM `user_atten_3` WHERE uid='1400696003') limit 12\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: bar_user_6
type: ref
possible_keys: bid
key: bid
key_len: 4
ref: const
rows: 581295
filtered: 100.00
Extra: Using where; Using index
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: user_atten_3
type: eq_ref
possible_keys: uid
key: uid
key_len: 30
ref: const,func
rows: 1
filtered: 100.00
Extra: Using where; Using index
2 rows in set, 1 warning (0.00 sec)


优化方案,改写成关联查询

localhost.user>explain extended select bar.uid from bar_user_6 as bar ,user_atten_3 as user where bid='9279'  and bar.uid = user.a_uid and user.uid='1400696003' limit 12\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: ref
possible_keys: uid
key: uid
key_len: 22
ref: const
rows: 1
filtered: 100.00
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: bar
type: eq_ref
possible_keys: bid
key: bid
key_len: 12
ref: const,user.user.a_uid
rows: 1
filtered: 100.00
Extra: Using index


子查询的查询过程(循环嵌套):

for each row in t1 matching range {
for each row in t2 matching reference key {
for each row in t3 {
if row satisfies join conditions,
send to client
}
}
}


参考文档:

http://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html

http://hidba.org/?p=819

http://hidba.org/?p=624

http://hidba.org/?p=743
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: