

如果索引结构采取的是二叉树或者红黑树的时候出现的问题。
而红黑树的问题B树就能很好的解决
这里B树、B+树
Hash算法 平衡二叉树(调整平衡)_羡云不羡君的博客-CSDN博客



二级索引也叫非聚集索引:叶子节点下面挂的是主键。(非聚集索引都是非主键字段)
聚集索引:叶子节点下面挂的是这一行的数据。(见上面的聚集索引选取规则)
一条sql的执行过程:
![]()
这里的条件是根据name去查询。所以就要根据name这个字段的二级索引来查询。就能查询到Arm的id为10。然后再根据id=10 聚集索引去查询这一行的数据。
参考:
mysql中主键、普通索引、唯一索引和全文索引_han_cui的博客-CSDN博客_mysql 唯一索引 排序

[UNIQUE | FULLTEXT] 没有写的话这里默认是普通索引(常规索引)
(index_col_name,...):字段名:可以是一个字段,也可以是多个字段。如果关联一个字段表示单列索引,关联多个字段叫联合索引(组合索引)


如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)
假设这里创建了一个联合索引并按照如下顺序(profession、age、status)

这条sql语句就会使用这个联合索引,因为这条sql是最左边的字段有,并且没有跳过任何一个字段
这条sql语句就会使用这个联合索引,因为这条sql是最左边的字段有,并且没有跳过任何一个字段

这条sql语句就会使用这个联合索引,因为这条sql是最左边的字段有,并且没有跳过任何一个字段

这条sql会完全失效。因为没有最左边的字段了

这条sql会部分失效(只有profession生效),status失效了,因为中间跳过了一个age字段。

这条sql索引会生效,因为最左边的字段存在,中间也没有跳过任何一个字段,这个与sql中的字段顺序没有关系。
联合查询中,出现范围查询(>,<) ,范围查询右侧的列索引失效。

索引部分失效:这条sql中只有profession字段索引生效。
索引完全生效
结论:所有我们在进行范围查询的时候尽量使用>=或<=
不要在索引列上进行运算操作,索引将失效。
phone字段有个单列索引。 对phone字段使用了字符串截取函数。

字符串类型字段使用时,不加引号,索引将失效。(这与mysql中的隐式转换有关)
MySQL 字符串类型用数字可以查出来 MySQL字符串类型会转换成数字 MySQL隐式类型转换_HaHa_Sir的博客-CSDN博客

status这个字符串类型字段,没有使用引号,导致联合索引部分失效(status失效)
![]()
phone这个字符串类型字段,单列索引失效。
如果仅仅是尾部的模糊匹配,索引不会失效。如果头部进行模糊匹配,索引失效。

只有第一条sql索引不会失效

如果Mysql评估使用索引比全表更慢,则不使用索引。

use index 与 force index的区别:use index 只是建议Mysql使用这个索引,而force index是强制使用这个索引。
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够使用),减少select *。
例:假设已经为name字段创建了索引

这里需要返回的列就是id,name。id在name这个二级索引中的叶子节点已经能够找到了,所以这里不会回表查询。这就是覆盖索引。

这里多了一个gender字段,而gender字段在name这个二级索引中不能找到需要回表查询。
当字段类型为字符串时(varchar,text等),有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘io,影响查询效率。此时可以将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

这里的n表示要提取这个字符串前面的几个字符来构建索引。

