SELECT * FROM `tbl` WHERE rid = 20 and id > 3 and name='xiaozhao' AND id IN ( SELECT id FROM `tbl` WHERE rid = 32 and id > 3 and name='xiaozhao') ORDER BY id DESC LIMIT 0 , 9
版主真是了解我,我正是为索引问题而来的!首先,我在rid, id上建立了索引create index ind_rid_id on tbl(rid, id);这样建立索引是为了筛选出rid = 20后以id排序!(对于子查询中的子句也可以讲explain中的ref项变为const). 如此,则很适合以下这条查询语句:SELECT * FROM `tbl` force index(ind_rid_id) WHERE rid = 20 and id > 3 and name='xiaozhao' ORDER BY id DESC LIMIT 0 , 9 但当为了实现'并且'的逻辑时,则需要一个子查询,正如顶楼给的语句:SELECT * FROM `tbl` force index(ind_rid_id) WHERE rid = 20 and id > 3 and name='xiaozhao' AND id IN ( SELECT id FROM `tbl` force index(ind_rid_id) WHERE rid = 32 and id > 3 and name='xiaozhao') ORDER BY id DESC LIMIT 0 , 9 但是问题出来了,对于子查询mysql 优化器没法判断哪个结果集小,哪个结果集大,从而无法实现小结果集驱动大结果集的原则!比如,在tbl表中,符合rid = 20 and id > 3 and name='xiaozhao'的记录为100000条,而符合rid = 32 and id > 3 and name='xiaozhao'的记录为10条,这就造成需要遍历100000*1条记录才能得到最后的结果,但用联合查询join的时候,mysql好像是可以正确计算出哪个结果集小哪个结果集大,进而给出正确的执行计划!不知是不是这样?版主还有什么样的建议?
rid = 20 and id > 3 and name='xiaozhao'这个需要一个索引 (rid, name,id)
select a.* from `tbl` a,`tbl` b where a.id=b.id and a.rid = 20 and a.id > 3 and a.name='xiaozhao' and b.rid = 32 and b.id > 3 and b.name='xiaozhao' ORDER BY a.id DESC LIMIT 0 , 9不知道这样行不行
from tbl a inner join tbl b using(id)
where a.rid = 20 and a.id > 3 and a.name='xiaozhao'
and b.rid = 32 and b.id > 3 and b.name='xiaozhao'
版主真是了解我,我正是为索引问题而来的!首先,我在rid, id上建立了索引create index ind_rid_id on tbl(rid, id);这样建立索引是为了筛选出rid = 20后以id排序!(对于子查询中的子句也可以讲explain中的ref项变为const). 如此,则很适合以下这条查询语句:SELECT *
FROM `tbl` force index(ind_rid_id)
WHERE rid = 20 and id > 3 and name='xiaozhao'
ORDER BY id DESC LIMIT 0 , 9
但当为了实现'并且'的逻辑时,则需要一个子查询,正如顶楼给的语句:SELECT *
FROM `tbl` force index(ind_rid_id)
WHERE rid = 20 and id > 3 and name='xiaozhao' AND id
IN ( SELECT id FROM `tbl` force index(ind_rid_id) WHERE rid = 32 and id > 3 and name='xiaozhao')
ORDER BY id DESC LIMIT 0 , 9
但是问题出来了,对于子查询mysql 优化器没法判断哪个结果集小,哪个结果集大,从而无法实现小结果集驱动大结果集的原则!比如,在tbl表中,符合rid = 20 and id > 3 and name='xiaozhao'的记录为100000条,而符合rid = 32 and id > 3 and name='xiaozhao'的记录为10条,这就造成需要遍历100000*1条记录才能得到最后的结果,但用联合查询join的时候,mysql好像是可以正确计算出哪个结果集小哪个结果集大,进而给出正确的执行计划!不知是不是这样?版主还有什么样的建议?
and a.rid = 20 and a.id > 3 and a.name='xiaozhao'
and b.rid = 32 and b.id > 3 and b.name='xiaozhao'
ORDER BY a.id DESC LIMIT 0 , 9不知道这样行不行