2条sql的执行对比
关联条件时就限制了b.dl_date,此时最终结果保留了所有的a表的记录
关联后过滤,此时左表没关联上的也被where过滤掉了,因为未关联的记录b.dl_date为NULL
1explain可以用于哪些操作?
select
2 为什么使用索引?
索引是一种有序的数据存储结构,使用它,是它根据某个key,创建了一颗索引树,它的数据记录比原表要少,走索引比全表扫描所经历的路径更短,这样使用它才有意义
3 explain的作用?
查询优化器,执行它可以看到执行计划,计划中包含了几个信息,也就是它返回的几个字段各自代表什么含义,即下面的重点
4 执行计划都包含了哪几个字段,每个字段都大致反映出什么问题?
id序号,值相同的位于同一级别,sql中的多表,执行是有先后顺序的,id越大越先执行,这点可以针对最近写的sql,时常加上explain看一看。时间长了,再到这里逐个记录
5各个字段适用的sql是什么样子的,有没有示例展示?
EXPLAIN
SELECT a.itemid,a.name AS itemname ,a.version,a.ItemCode AS contentcode,a.Exclusivity,
a.ContentProviderID AS cpid,g.name AS cpname,
a.spid,h.name AS spname,
a.umcp,
b.channeltype,b.channelcode,
c.albumid, d.name AS albumname,
(SELECT GROUP_CONCAT(e.name) FROM masterdb.artistinfo e,masterdb.itemartist f WHERE f.ItemID=a.ItemID AND e.ArtistID=f.ArtistID) itemartist
FROM masterdb.iteminfo a
LEFT JOIN (SELECT itemid ,TYPE AS channeltype,GROUP_CONCAT( channelcode ORDER BY channelcode) channelcode FROM masterdb.item_channelinfo
GROUP BY itemid,TYPE) b ON b.itemid=a.itemid
LEFT JOIN masterdb.itemalbum c ON c.itemid=a.itemid
LEFT JOIN masterdb.albuminfo d ON d.albumid=c.albumid
LEFT JOIN masterdb.contentproviderinfo g ON g.ContentProviderID=a.ContentProviderID
LEFT JOIN masterdb.contentprovidergroupinfo h ON h.ContentProviderGroupID=a.spid
WHERE a.copyright_source='AT' AND a.statusid=404 AND a.spid!=128
分析:
item_channelinfo作为子查询的表存在,select_type为Derived
执行顺序,按照id,先执行序号大的,同序号的,从上到下依次执行,总结下来就是,优先执行子查询,再依次执行join表,注意:可以和join的先后不一致
type字段,对于前三个是ref类型,因为它的关联字段是主键或者索引,后面d,g,h是eq_ref 是因为他们的on连接字段只是关联表的普通字段
U_Key这个值其实是个联合索引
key是针对当前表的一个连接字段类型,是不是主键,是不是索引,没有就是null,ref是关联字段的名字
ref为const是一个常量,例如 id=5这样,只能返回一条,这里的面的a表其他是拿自己的每一个主键id去跟别的表做关联,对于每个id而言,它只会返回一条数据,所以是const ,还有一个system,是个特列,还不是很清楚,没遇到实例情况,rows就是返回的记录数,怎么计算的行数还不清楚 ??
key_len的值怎么计算的不清除,只知道越小越好 ???