每天get到一个新知识点
主键索引和非主键索引并不在一个B+树里面。
主键索引B+树的非叶子节点存放的是主键列的值,叶子节点存放的是数据。
非主键索引B+树的非叶子节点存放的是索引列的值,叶子节点里面只存放了主键。
创建非主键索引就是在创建一个新的B+树。
索引类型见Mysql中的那些索引-CSDN博客
并且,,每建一个索引就是新建一个索引B+树。
打个比方(没打"比方",举个例子)
比如,拿字典来说,第一本字典,从前到后是有顺序的(主键索引是有顺序的),并且每页有页码(非叶子节点的索引值)和内容(叶子节点的数据),假如你只有这一本字典,你查东西是不是要慢很多啊,这不就是慢查场景和sql优化问题吗?
怎么解决呢?
那再建一本字典(索引B+树),这个字典我每页只存放第一本字典的页码(非主键索引叶子节点存的是主键),每页也有一个页码(非主键索引的列的值),假如说索引字段是一个状态字段,状态只有有效1和失效0,状态为0的在一页,状态为1的在一页。
现在,我要找有效的1。
我先去1的那一页去查它的页码(主键),带着主键再直接去第一本字典去查,就能很快找到想要的数据。
这一步也是解决慢查和sql优化的一种方式(建立索引),更是回表的场景,回表可能也会导致慢查,如果是回表导致的慢查,就只能从减少回表的次数上去优化。
减少回表
使用覆盖索引,需要查询的列作为索引。
使用复合索引,前提是查询经常涉及多个列。
避免使用select *全表查,改为查需要的列字段。