我需要解释聚集索引。使用Google,我发现只有SQL Server信息,而不是MySQL / InnoDB。
答案 0 :(得分:1)
对于MySQL ......(警告:其他供应商的答案略有不同。)
MySQL,MyISAM和InnoDB中有两个主要的“引擎”。
对于InnoDB,PRIMARY KEY
(“PK”)具有这些特征。 (MyISAM不同。)
在该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。