innoDb引擎不支持hash索引 memory引擎支持hash索引
b+索引树
每个结点的存放的是他子节点中最小值的一棵树,每个结点可以存放多个字段,又可以分为聚簇索引和非聚簇索引
聚簇索引 | 主键索引树,叶子结点存的是数据 |
非聚簇索引 | 叶子结点存的是主键的值,要进行回表才能找到对应的数据 |
如果id是主键索引树, 则叶子结点的data区域存放的该行的数据. 如果是其他字段做的非主键索引树 则 叶子结点的data区域存放的是id的值 没有存整行的数据, 则会进行回表再做一次查询 性能略差.
如果没有做索引树,则会整一个没有重复的作为索引树,可能会把string作为索引树 这样会导致性能极大降低 ,如果都重复了则再会新生成一个, 所以我们最好指定一个 不重复的作为主键.
覆盖索引查询 只差做索引树的字段 和id 因为叶子结点存了id 不会回表
2.索引什么时候会失效
2.1 独立的列, 索引不能是表达式的一部分
每次都会对id进行累加, 会造成全表扫描 使用concat拼接 也会造成该效果
2.2 like 不能以%开头 会失效
可以使用es的模糊查询 或者mogodb的方法
2.3 要查询的数据左边是字符串右边= 是数字需要类型转换
2.4 最左匹配原则 🚩
添加的索引是有顺序的,在添加索引字段是按照什么顺序,查询就要按照什么顺序,但是底层有执行优化器会根据索引顺序进进行调整
但是 如果有三个索引的话 查询时 第一个索引不存在 则会导致统一匹配索引失效 ,添加组合索引时,应该按照区分度有高到底来添加索引
explain 查看语句的执行效率
通过explain的type字段 可以查看索引是否命中, 以此来评估性能标准,一般使用的为ref(非唯一性索引扫描)之上
possible_keys可用的索引 key为使用的索引 使用force index(索引名) 指定索引