在InnoDB实现索引的B+树中,如何处理重复的键。
例如,如果有一个有100万行的表,其中有一个基数为10的列。如果我们在该列上创建索引,那么生成的B+树会是什么样的呢?
它是否只有10个键,每个键的值是属于该键的主键列表(如果是,在什么结构中?链表?)或者它会有1M个键(如果是,那么B+树必须以不同的方式处理)?
发布于 2016-07-09 17:53:39
从某种意义上说,InnoDB BTree没有复制项。这是因为PRIMARY KEY的列被附加到为辅助键指定的列中。这就形成了一个完整有序的列表。
当您通过辅助键(或键的初始部分)进行查找时,查询将向下钻取BTree以查找索引中与您给定的内容相匹配的第一行,然后向前扫描以获得任何其他行。要获得其余的列,需要使用PRIMARY KEY列进行第二次BTree查找。
优化器很少使用具有“低基数”的索引。例如,不应将“是/否”或“真/假”或“男/女”列编入索引。优化器会发现更快的是简单地扫描表,而不是在索引和(通过PK列)主BTree之间来回跳。
何时使用该指数的截止点在20%左右,这取决于月亮的相位。
发布于 2016-07-05 07:48:07
坏指数
对于B+树来说,您提议的情况是不好的。基数为10表示only 10 of the 1 million values are unique。实际上,它不仅对B+树不利,在一般情况下它也是一个糟糕的索引。根据这个索引,您将平均留下一个大约的子集。100,000个值,您必须查看这些值,或者使用另一个值来进一步筛选。
B+树性质
关于结果树的结构,这里有一些需要记住的事情:
https://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-
https://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-
期望值
如果您用键插入了很多数据,这些键或多或少都属于相同的等价类,那么我希望有一棵树,它不会有多大帮助。这10个键可能只存在于根节点中,而树中更深的所有数据都将被取消排序(因为没有什么可排序的了)。
由于leafs是双链接列表,所以基本上只剩下我在开头所写的内容:您必须遍历大量的值。关于给定的索引,这必须是预期的,而且B+树在这种情况下可能会做得很好(只需要查看所有数据,列表就可以了)。
实际上,这是一个更深层次的抽象:叶是双链接的,但是每个叶中有多个值(数据或PK链接)。尽管如此,这些也在一个列表中,所以如果你只是遍历所有的东西,它就不会有多大的区别。
检查InnoDB空间
请注意,您也可以调查MySQL到底在构建什么。有检查生成的索引数据结构的工具,例如,请参阅
发布于 2016-07-05 14:38:49
InnoDB将表存储在名为内部主索引的B+树索引中。索引的键是您的主键字段。
如果定义辅助索引,则会有附加的B+树索引(在.ibd或ibdata1中),其中键是辅助索引字段,值是主键。
B+树本身不要求密钥是唯一的。主索引和所有唯一索引的唯一性在服务器级别强制执行。
下面是一些关于InnoDB如何组织索引并使用它们访问数据的幻灯片。http://www.slideshare.net/akuzminsky/efficient-indexes-in-mysql#downloads-panel
https://stackoverflow.com/questions/38197083
复制相似问题