MySQL索引八股整理
整理一下MySQL索引的八股。 索引介绍 索引是数据库中用于加速查询的数据结构,通过对表中某列或多列的值进行排序,可以快速定位所要查找的数据。就像小时候在汉语字典里查字时,会先根据偏旁笔画数找到偏旁,然后根据剩余笔画找到目标字,这比在整个字典中一个一个查找是快很多的。 索引分类 索引有以下分类 索引详细介绍 主键索引: 主键索引用于唯一标识表中的每条记录,其值必须唯一且非空。每个表只允许有一个主键索引,一般为表中的自增id。 创建主键时,数据库会自动生成主键索引。若没有指定主键,MySQL的InnoDB存储引擎会优先选择一个非空的唯一索引作为主键,如果没有符合条件的索引,MySQL会自动生成一个隐藏的聚簇索引。 唯一索引: 主键索引 = 唯一索引 + 非空,每个表可以有多个唯一索引,同时唯一索引允许值为NULL,这是和主键索引不同的地方。唯一索引强制字段值的唯一性,插入或更新时会触发唯一检查,适用于业务唯一性约束的字段,比如邮箱。在建表定义唯一键时,会自动生成唯一索引。 键和索引的区别在于键是逻辑概念,而索引是物理实现,在磁盘中有着实际的存储。 普通索引: 普通索引仅用于加速查询,不会限制字段值的唯一性。 全文索引 全文索引是MySQL一种优化文本数据检索的特殊类型索引,适用于CHAR, VARCHAR, TEXT等字段。MySQL 5.7 及以上版本内置了 ngram 解析器,可处理中文、日文和韩文等分词。全文索引底层不再是 B+ 树索引。 建表时通过 FULLTEXT (title, body) 来定义。通过 MATCH(col1, col2) AGAINST('keyword') 进行检索,默认按照降序返回结果,支持布尔模式查询。 + 表示必须包含; - 表示排除; * 表示通配符; -- 使用布尔模式查询 SELECT * FROM articles WHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE); 这样查询性能比LIKE '%keyword%'高很多。对于复杂的中文场景可以用Elasticsearch等专业搜索引擎替代。 B+ 树索引: B+ 树是一种高度平衡的多路查找树,能有效降低磁盘的 IO 次数,并且支持有序遍历和范围查询。 相比普通二叉树,B+ 树可以将亿级数据量控制在3-4层树高,极大减少磁盘的 I/O 次数。因为树越高意味着查找数据时就需要更多的磁盘 IO,因为每一层都可能需要从磁盘加载新的节点。 ...