我看不到聚集索引的意义,我们什么时候会受益?
4 回答
聚集索引
聚集索引意味着记录基于索引按顺序物理存储(至少彼此靠近)。当您按顺序从每条记录中检索不同的列时,聚集索引是最重要的,因为数据库引擎不必四处跳转来获取下一条记录。相反,记录是按顺序存储的,因此记录之间的查找时间最短。
在读取索引中彼此靠近的多条记录时,聚集索引是最重要的。
默认情况下,使用 InnoDB,您的主索引是聚集索引。
聚集索引的用例
如果您正在执行像 Google 和 Yahoo 搜索这样的增量搜索,当您开始输入时,您会看到与您迄今为止输入的内容相匹配的前几条记录,那么性能是最重要的。如果您只返回结果集中的单个索引列,则不需要聚集索引,但我们假设您还想返回每个 key_word 的命中数,从而强制数据库引擎访问实际行。由于要返回连续行,因此应按顺序存储它们以获得最佳性能。
SELECT key_word, hits FROM keywords
WHERE key_word LIKE 'britney s%'
ORDER BY key_word
LIMIT 10
您希望您的主键(聚集索引)位于key_word
.
与非聚集索引的比较
所有索引都是按顺序物理存储的(实际上是一个 btree,但基本上是),所以如果您只返回存储在索引中的列,您仍然可以获得相同的好处。那是因为索引列的实际值存储在索引中,因此 MySQL 将使用索引值而不是读取记录。但是,如果您开始检索不属于索引的列,那么您还希望在此处按顺序存储实际记录,例如使用聚集索引。
关于聚集索引的 MySQL 文档
通过聚集索引访问行速度很快,因为行数据位于索引搜索引导的同一页上。如果表很大,与使用与索引记录不同的页面存储行数据的存储组织相比,聚集索引架构通常会节省磁盘 I/O 操作。(例如,MyISAM 将一个文件用于数据行,将另一个文件用于索引记录。)
在 InnoDB 中,非聚集索引(也称为二级索引)中的记录包含不在二级索引中的行的主键列。InnoDB 使用这个主键值来搜索聚集索引中的行。如果主键长,二级索引占用的空间就更多,所以主键短是有利的。
我能想到的最好的例子是在交易日期定期查询的报告表。我会在 TransactionDate 列上放置一个聚集索引,并根据查询优化添加任何其他所需的索引。
因此,像这样的查询select sum (amount) from transactiondetails where TransactionDate > 'jan 01 2010' and TransactionDate < 'feb 01 2010'
将使用聚集索引进行搜索,并以更有效的方式得出结果。
按名字排序的真实地址簿(死树版本)在结构和用途上类似于聚集索引。
群集索引可以大大提高检索的总体速度,但通常仅在数据以相同或相反的顺序访问群集索引或选择一定范围的项目时才依次访问。
由于物理记录在磁盘上是按这种排序顺序排列的,因此序列中的下一行项目紧挨在最后一行之前或之后,因此需要较少的数据块读取。
资料来源:维基百科:数据库索引 - 集群
看这里,在它说的页面的一半处:
通过聚集索引访问行速度很快,因为行数据位于索引搜索引导的同一页上。如果表很大,与使用与索引记录不同的页面存储行数据的存储组织相比,聚集索引架构通常会节省磁盘 I/O 操作。(例如,MyISAM 将一个文件用于数据行,将另一个文件用于索引记录。)
速度听起来对我来说是一个很好的理由..还是我错过了你的观点?
聚集索引的优点是可以使用比“普通”索引更少的 io 操作来访问(并因此搜索)它。了解这一点后,您可以通过将聚集索引放置在对您最有利的位置来优化您的数据库访问,从而优化您的应用程序。