Mysql索引总结(1)
先来说几个小点:
索引是数据的目录。
如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法就是存储引擎。MySQL 存储引擎有 MyISAM 、InnoDB(MySQL5.5后默认)、Memory。
索引的分类:
按数据结构分类:
B+tree索引:是最常用的索引结构,InnoDB 存储引擎默认使用 B+树索引。它的特点是能够保持数据稳定有序,并且叶子节点之间通过指针连接,便于范围查询。
Hash索引:基于哈希表实现,查找速度快,但不支持范围查询,因为哈希函数将键映射到哈希表中的位置,是随机的。
Full text索引:主要用于全文搜索,能够对文本内容进行分词等操作,从而支持复杂的文本搜索查询。
按物理存储分类:
聚簇索引(主键索引):索引和数据 "绑" 在一起,找起来快,但修改起来麻烦(改了索引可能要动整体顺序)
非聚簇索引(辅助索引):索引和数据分开存,修改方便,但查询时可能要多一步(先查索引再找数据)
按字段特性分类:
主键索引:是一种特殊的唯一索引,不允许有空值,一个表只能有一个主键索引。
唯一索引:索引列的值必须唯一,但可以有空值(如果是单列唯一索引,多列的话组合值唯一)。
普通索引:最基本的索引类型,没有唯一性等特殊限制,用于提高查询效率。
前缀索引:对字符串类型的列,只取其前面部分字符建立索引,用于减少索引存储空间等情况。
按字段个数分类:
单列索引:基于单个字段建立的索引。
联合索引:基于多个字段组合建立的索引,遵循“最左前缀”原则等,在查询时能更高效地利用索引。(ps:最左匹配原则,也就是按照最左优先的方式进行索引的匹配。在使用联合索引进行查询的时候,如果不遵循「最左匹配原则」,联合索引会失效,这样就无法利用到索引快速查询的特性了。)
B+Tree 存储千万级的数据只需要 3-4 层高度就可以满足,这意味着从千万级的表查询目标数据最多需要 3-4 次磁盘 I/O,所以B+Tree 相比于 B 树和二叉树来说,最大的优势在于查询效率很高,因为即使在数据量很大的情况,查询一个数据的磁盘 I/O 依然维持在 3-4次。
主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里;
二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据。(所以非聚簇索引要回表查询)ps:回表:先检二级索引中的 B+Tree 的索引值(商品编码,product_no),找到对应的叶子节点,然后获取主键值,然后再通过主键索引中的 B+Tree 树查询到对应的叶子节点,然后获取整行数据。这个过程叫「回表」,也就是说要查两个 B+Tree 才能查到数据
ps2:当查询的数据是能在二级索引的 B+Tree 的叶子节点里查询到,这时就不用再查主键索引。这种在二级索引的 B+Tree 就能查询到结果的过程就叫作「覆盖索引」,也就是只需要查一个 B+Tree 就能找到数据。