InnoDB:什么是聚簇索引,什么是用例?

时间:2015-07-04 13:31:28

标签: mysql sql indexing innodb

我需要解释聚集索引。使用Google,我发现只有SQL Server信息,而不是MySQL / InnoDB。

  • 什么是聚集索引?
  • 使用聚集索引的最佳做法是什么?
  • MySQL的具体限制是什么?

1 个答案:

答案 0 :(得分:1)

对于MySQL ......(警告:其他供应商的答案略有不同。)

MySQL,MyISAM和InnoDB中有两个主要的“引擎”。

对于InnoDB,PRIMARY KEY(“PK”)具有这些特征。 (MyISAM不同。)

  • 只能有一个PK。
  • PK是独一无二的,它是一个INDEX。
  • PK与数据“聚集”。
  • PK以B+Tree
  • 组织

在该BTree中,存储整个记录,但按PK顺序排序。 BTree是一组“块”,每个块都有一些行以PK顺序“聚集”在一起。

由于加载块需要I / O(除非缓存),并且I / O需要时间,因此同时获取多行是很方便的。这种“聚类”原则提供了速度。

因此,一个特点:连续阅读PK是非常有效的。示例:SELECT * FROM tbl WHERE id BETWEEN 10 and 19;

每个“辅助”键都在单独的BTree中。这使得其中的“范围”扫描有效 - 部分。例如:

PRIMARY KEY(id)
INDEX(other)
SELECT * FROM table WHERE other >= 123 

这将钻进BTree,other找到123,然后向前扫描(可以说是一种聚类形式,但不是真正的“聚集索引”)有效地找到other的值*是理想的。对于它们中的每一个,它将进入聚类PK以查找表的PRIMARY KEY列。 (注意:PK存储在辅助密钥的BTree中;这是如何从辅助密钥一直返回到数据。)

最佳做法:几乎总是使用InnoDB;总是有一个clacDistancCornerCenter(); function clacDistancCornerCenter() { var center = document.getElementById('center').getBoundingClientRect(); var corner = document.getElementById('corner').getBoundingClientRect(); //alert("left =" + center.left + "top =" + center.top + "right =" + center.right + "bottom =" + center.bottom); var centerX = center.left; var centerY = center.top; var innersCornerX = corner.left; var innersCornerY = corner.top; //distance formula -> d = sqrt( pow( x2 - x1) + pow( y2 - y1) ) var distance = Math.sqrt(Math.pow(centerX - innersCornerX, 2) + Math.pow(centerY - innersCornerY, 2)); document.getElementById('outRotated').innerHTML = "Distance center to corner: "+ distance; } function horizontal() { $('div').css('transform', 'rotate(0deg)'); } function relocate(top, left) { var point = document.getElementById('corner'); if (top) { point.style.bottom = 'auto'; point.style.top = 0; } else { point.style.top = 'auto'; point.style.bottom = 0; } if (left) { point.style.right = 'auto'; point.style.left = 0; } else { point.style.left = 'auto'; point.style.right = 0; } clacDistancCornerCenter(); }

特定于MySQL的限制:没有其他“聚簇索引”。

附加物

TokuDB引擎(包含在MariaDB 10中;其他版本的MySQL的免费插件)是另一个“引擎”。它有more clustering options