
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
索引的应用是每一位软件开发程序员都需要熟练掌握的一个计算机编程技术,下面我们就通过案例分析来简单了解一下,数据库索引类型分享。
基本知识
InnoDB里表数据是按照主键顺序存放的。InnoDB会按照表定义的一个非空索引(按索引定义顺序)作为主键。索引(在MySQL中)是由存储引擎实现的。索引类型主要有顺序索引和哈希索引。顺序索引的底层结构是B+Tree,哈希索引的底层结构是哈希表。
索引是以空间换时间,减少了要扫描的数据量、避免排序、将随机IO变成顺序IO。使用索引的代价是:空间占用更大、插入和更新成本更大。顺序索引可支持:全值匹配、左顺序匹配、列前缀匹配、范围匹配、精确匹配数列并范围匹配一列、只访问索引的查询、索引扫描排序。哈希索引可支持:全值匹配。
顺序索引
InnoDB的顺序索引是将主键列表构建成一棵B+树。内节点存放的是均是主键值,叶子节点存放的是整张表的行数据。这样,可以让节点尽可能存放更多的主键值,从而降低树的高度。B+树是有序查找平衡树,高度通常在2-4之间,因为要尽可能减少磁盘读写次数。B+树的插入操作在节点关键数满的情况下,会分裂成两个子节点。理解B+树对于理解顺序索引非常关键。
顺序索引可以分为聚簇索引和非聚簇索引。
聚簇索引:在叶子节点中保存了B-Tree索引和数据行。将索引列放在内节点上,而将行数据放在叶子节点上。聚簇索引可以极大提升IO密集型的性能。一个表只能有一个聚簇索引,通常用主键列。聚簇索引的优插入顺序是按照主键值顺序插入。如果是随机插入,更新聚簇索引的代价较高:更多的查找操作、频繁的“页分裂”、移动大量数据、产生碎片。
非聚簇索引:非聚簇索引的内节点存放的是非聚簇索引列的值,叶子节点存储的是对应数据行的主键值。因此,根据非聚簇索引需要两次索引查找。先从叶子节点找到主键值,再根据主键值在聚簇索引里找到数据行。非聚簇索引因为不存储数据行的信息,因此占用空间会比聚簇索引更小。
哈希索引
使用哈希原理实现,性能很高,只能等值匹配,按索引整列匹配、不支持范围查找、不能用于排序。哈希函数可以选择crc32或者md5的一部分。哈希索引要避免大量冲突同时不占用过多空间。哈希索引的选择性取决于该列哈希列值的冲突度。Memory引擎支持哈希索引,也支持B+Tree索引。可以为较长的字符串(比如URL)创建哈希索引,在条件中必须同时带上哈希值条件和列值条件。
InnoDB为某些非常频繁的索引值在B+上在内存中再创建一个哈希索引,称为自适应哈希索引。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。