select * from i, r where i.id = r.id and r.rid = 439 and r.id > 1000 order by r.id desc limit 10;
select * from i, r where i.id = r.id and r.rid = 439 and r.id > 1000 and i.name="netxuning" order by r.id desc limit 10;
i表中id是主键,r表中在r(rid, id)上建立了索引,两条语句的不同之处就在于,第二条语句多了一个i表上name字段的判断,
在数据量巨大的时候,多出的条件导致了查询速度的巨大差别!第二条会相当慢!
我估计,其原因应该是第二条语句要列出结果就要判断i表的name字段,所以在判断的过程中就要join大量的字段,
而第一条语句则没有这样的顾虑,它的join时机是在r表上r.rid = 439, r.id > 1000 这两个条件都满足后,直接将最新的10条与i表join即可!不知道我分析的对不对!
还有就是,这样的两条语句explain的结果是一模一样的,一直误导了我!
EXPLAIN只能做参考,网上有文章说EXPLAIN也会撒谎
理论上应该不会。应该不是。
2, 'CC'这种索引还不如直接的1,
2
版主是说在name上建索引没用?
是的,建一个单独的NAME索引。
如果用name上的索引的话,在join过程中没有索引可依据,必定更慢!
不一定,要看你的数据分布。
JOIN中总有一个表上是用不了索引的关键是如果让你人为的决定,你会如何计划这个SQL语句的执行方案。根据这个,然后再看需要添加什么索引,或者使用索引HINT.
首先看这张表是不是单一字段做PK,
如果没有,在找单一字段的Unique Key
如果还没有的话,处理方式忘记了,但肯定会让索引效率降低很多