免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1359 | 回复: 3
打印 上一主题 下一主题

【讨论中】mysql的loose index [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-26 15:52 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-09-26 18:01 编辑

最近看mysql手册,看上边对于松散索引扫描和紧凑索引扫描的解释,很让我迷惑,

松散扫描如下
[code]
    通过该访问方法,MySQL使用某些关键字排序的索引类型(例如,B-树)的属性。该属性允许使用 索引中的查找组而不需要考虑满足所有WHERE条件的索引中的所有关键字。既然该访问方法只考虑索引中的关键字的一小部分,它被称为松散索引扫描。如果没有WHERE子句, 松散索引扫描读取的关键字数量与组数量一样多,可以比所有关键字数小得多。如果WHERE子句包含范围判断式, 松散索引扫描查找满足范围条件的每个组的第1个关键字,并且再次读取尽可能最少数量的关键字。

紧凑索引扫描

    对于引用GROUP BY关键字元素的前面、中间关键字元素的查询中的所有列,有一个常量等式条件即足够了。等式条件中的常量填充了搜索关键字中的“差距”,可以形成完整的索引前缀。这些索引前缀可以用于索引查找。如果需要排序GROUP BY结果,并且能够形成索引前缀的搜索关键字,MySQL还可以避免额外的排序操作,因为使用有顺序的索引的前缀进行搜索已经按顺序检索到了所有关键字。


看飘红文字,既然补齐了完整的索引前缀,为什么就不能使用btree的属性-》在松散索引扫描中提到的查找组,求指导,我已经拿出数据结构的书再找了但找不到合理的解释!本人对这些数据结构完全自己看的,可能是理解的不正确,请过来人解释一下这个问题!

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
2 [报告]
发表于 2012-09-26 16:26 |只看该作者
从内部理解是很辛苦的。

我从全局去理解松散和紧凑索引

松散,只要scan一部分的group_id,就可以找到你要的数据
紧凑,需要scan全部的group_id,才能找你你要的数据

例子:
EXPLAIN SELECT actor_id, MAX(film_id)
FROM film_actor
Where actor_id <102
GROUP BY actor_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: film_actor
         type: range
possible_keys: NULL
          key: idx_actor_film_id
      key_len: 4
          ref: NULL
         rows: 1004
        Extra: Using index for group-by

1 row in set (0.00 sec)



EXPLAIN SELECT actor_id, MAX(film_id)
FROM film_actor
Where actor_id =101
GROUP BY actor_id\G

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: film_actor
         type: ref
possible_keys: idx_actor_film_id
          key: idx_actor_film_id
      key_len: 4
          ref: const
         rows: 4095
        Extra: Using index

1 row in set (0.00 sec)


我这里示例的数据就是actor_id=101和102的相关数据。

明显可以看出,松散只找了1004行
                   而紧凑找了4095行

我认为这是它们比较明显的区别,也可以看出松散比紧凑快。

至于算法是如何实现的?数据结构的BTree树是怎样的?还没有时间去理解和深究,如有高手出来,说出一二。

或者反驳我的观点,我非常开心,以上是我的愚见。

论坛徽章:
0
3 [报告]
发表于 2012-09-26 17:19 |只看该作者
谢谢,我明白您的意思,您把第一个actor_id <102改成actor_id=102,现在只有group by条件不同,但是actor_id=2已经补齐了这个最左前缀索引,用到btree的属性“允许使用 索引中的查找组而不需要考虑满足所有WHERE条件的索引中的所有关键字”,那后一种情况下也应该可以去到分好组的关键字吧,为什么一定要扫描所有符合条件的关键字呢。

论坛徽章:
0
4 [报告]
发表于 2012-09-27 17:43 |只看该作者
from http://stackoverflow
Some implementations simply concatenate the values in the order of the columns, with delimiters.
[简单的按顺序连接各列得值,用分隔符隔开]

Another solution is to simply have a b-tree within a b-tree. When you hit a leaf on the first column, you get both a list of matching records and a mini b-tree of the next column, and so on. Thus, the order of the columns specified in the index makes a huge difference on whether that index will be useful for particular queries
[另一个方案是用一个btree索引另一个btree,当你检索到一个第一列的一个叶子节点时,你会得到一个比较小的数据集以及相匹配的下一个列的btree,以相同方式检索下一列。所以索引中声明的列的顺序对查询能不能使用索引的影响比较大]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP