- MySQL 不同的引擎对于索引有不同的支持。
InnoDB 和 MyISAM 索引使用的是 B + Tree,而Mermory 索引使用的是 Hash。 - MySQL 一个表最多创建 64 个索引,索引最多包含 16 个列。
- MySQL 索引选用 B+树的原因
1)提高索引查询时的磁盘 IO效率,还可以提高范围查询的效率; 2)查询 IO 次数更少,特别是范围查询; 3)所有查询都有查找到叶子节点,查询性能稳定; 4)B+ 树里的元素也都是有序的; - MySql B+ 树索引和哈希索引的区别
1)哈希索引适合等值查询,但是无法进行范围查询; 2)哈希索引无法利用索引完成排序; 3)哈希索引不支持多列联合索引的最左匹配规则; 4)如果有大量重复键值的情况,就可能存在哈希碰撞问题,哈希索引的效率会很低; 所以说,B+ 树索引绝对适用于大多数场景,用B+ 树索引就可以了. - MySql 索引失效常见的场景
1)不符合索引最左匹配原则; 2)like 模糊查询以 % 开头; 3)索引列上使用了函数、表达式计算; 4)数据类型出现隐式转化,即查询条件索引列类型和查询数据类型不一致; 5)join 条件中索引列数据类型不一致; 6)条件存在 null 值,如:name is not null; 7)使用了 !=、<>、not in 判断条件; 8)查询条件使用了 or ,要想索引生效,or 中的每一列都加上索引; - MySql 引擎 MyISAM 和 InnoDB 的区别
1)MyISAM 不支持事务, InnoDB 支持事务; 2)MyISAM 只支持表级锁, InnoDB 支持表级锁和行级锁; 3)MyISAM 不支持外键,InnoDB 支持; 4)MyISAM 允许没有任何索引和主键,InnoDB 必须要有; 5)MyISAM 表和索引分两个文件存储,InnoDB 表和索引都保存再同一个数据文件中; - MySql 引擎的物理存储文件
1)MySql InnoDB 引擎在磁盘上存储了两个文件:
- .frm
存在与表相关的元数据信息,包括表结构的定义信息等; - .idb
存在 InnoDB 所有表数据和索引; 2)MySql MyISAM 引擎在磁盘上存储了三个文件: - .frm
存在与表相关的元数据信息,包括表结构的定义信息等; - .myd
存储 MyISAM 引擎的表数据; - .myi 文件
存储 MyISAM 引擎的表索引相关数据;
|