日期:2014-05-16  浏览次数:21028 次

何为松散索引扫描? 何为紧凑索引扫描?
CREATE TABLE `t3` (
`id` int(11) NOT NULL DEFAULT '0',
`u` char(100) DEFAULT NULL,
`v` char(100) DEFAULT NULL,
`w` char(100) DEFAULT NULL,
`x` char(100) DEFAULT NULL,
`y` char(100) DEFAULT NULL,
`z` char(100) DEFAULT NULL,
`iu` int(11) DEFAULT NULL,
`iv` int(11) DEFAULT NULL,
`iw` int(11) DEFAULT NULL,
`ix` int(11) DEFAULT NULL,
`iy` int(11) DEFAULT NULL,
`iz` int(11) DEFAULT NULL,
UNIQUE KEY `i_id` (`id`) USING BTREE,
KEY `i_u_v_w` (`u`,`v`,`w`) USING BTREE,
KEY `i_iu_iv_iw` (`iu`,`iv`,`iw`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

==================================================================

我直接测试发现, 只有select iu, max(iv) 或 min(iv) from t3 group by iu; 方出现 Using index for group-by(松散索引扫描)

其他组合, 甚至select iu, max(iv) 或 min(iv) from t3 group by iu, iv; 均提示using index


问题1, 为什么去掉max后就不是Using index for group-by, 而是using index

问题2, 到底什么是紧凑索引扫描, 什么是松散索引扫描?



在mysql官方的在线手册有http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#group-by-optimization有相关描述, 


但是我根据它提供的范例完全不能搞明白什么是松散索引扫描?


这个问题我已经在网上找了一周了, 无奈大多数文章均为抄袭, 还是没搞明白, 希望大家能帮助我, 谢谢


------解决方案--------------------
首先你要明白什么场景下会用到松散索引扫描?相对松散扫描有紧凑扫描。

为什么你用了max函数就会用到松散扫描呢?请看使用松散索引扫描的条件。
当mysql 在group by 时 发现不能满足紧凑扫描时,尝试松散扫描(这相对于紧凑效率会率高,具体我尚未测试过),如果连松散都不能用,那么可能会用到临时表或者文件排序。

要利用到松散索引扫描实现GROUP BY,需要至少满足以下几个条件:
◆ GROUP BY 条件字段必须在同一个索引中最前面的连续位置;
◆ 在使用GROUP BY 的同时,只能使用MAX 和MIN 这两个聚合函数;
◆ 如果引用到了该索引中GROUP BY 条件之外的字段条件的时候,必须以常量形式存在;

现在明白了吧!!!!11