浅谈MySQL的聚集索引
聚集索引也称聚簇索引,英文为clustered index,这里通过一个关于新华字典的类比来浅谈下MySQL的聚集索引。
下面是一个类比:
新华字典的1页:1个磁盘页
根据拼音查找字和根据偏旁查找字:2种数据库索引
我们的大脑:内存
假如执行如下SQL,select * from xinhuazidian where pinyin=“zhang”,也就是查询所有拼音为“zhang”的字,类比到新华字典查找字的过程是:先从拼音索引查找“zhang”,确定了符合条件的字是从第m页到第n页(n>m),然后翻到这些页上,最后把要查的这些字读入脑海中。
聚集索引特点:连续的、直接代表了数据本身
又假如执行如下SQL,select * from xinhuazidian where pianpang=“弓”,也就是查询所有偏旁为“弓”的字,类比到新华字典查找字的过程是:先从偏旁索引查找“弓”,确定了符合条件的字所在的页,例如“张”在第x页,“弛”在第y页,“引”在第z页,等等,同样地,接着也是翻页查字,但这些页并非连续的,而且翻到某页时,满足条件的字可能就只是其中的一个或者几个而已。
非聚集索引特点:非聚集索引本身其实是一个中转,并不就是数据本身,需要转两道才能到数据本身,非聚集索引也不是连续的
聚集索引(主键)是通往真实数据所在的唯一路径
这两个SQL都是通过索引确定字的所在页,然后翻到对应的页,读入符合条件的字。但是在翻页读字的效率上,前者明显要高于后者。
众所周知,新华字典的字是按照26个字母(从a到z)的字典序进行排版的,这与根据拼音查找字这种索引的排列方式是一致的,所以,根据拼音查找字时,能连续翻页,而根据偏旁查找字时,就只能跳页查字。
根据拼音查找字的这种索引,就称为聚集索引,聚集索引在磁盘中的存放顺序,与数据表表项在磁盘中的存放顺序是一致的。聚集索引的英文中,clustered很好地描述了这个现象:满足某个聚集索引的数据库表项,是聚集在几个连续的磁盘页中。
相应地,根据偏旁查找字的这种索引,就只是一种普通索引,一个数据表只能有一个聚集索引,因为数据表表项的存放顺序只可能有一种方式。
综上所述,聚集索引是一种特别适合范围查找的优化手段。例如,某一个数据表有一个列是时间,另外的列描述这个时间发生的人物地点事情,那么,以时间为聚集索引,就能很快速地查找到某个时间段发生的事情以及这件事情的其他细节。