• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

作甚松散索引扫描? 何为紧凑索引扫描

mysql 搞代码 7年前 (2018-06-05) 219次浏览 已收录 0个评论

何为松散索引扫描? 何为紧凑索引扫描?
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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:作甚松散索引扫描? 何为紧凑索引扫描

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址