MYSQL(索引篇)

一、什么是索引

索引是一种数据结构,它用来帮助MYSQL更高效的获取数据

采用索引可以提高数据检索的效率,降低IO成本

通过索引对数据排序,降低数据排序成本,降低CPU消耗

常见的有:B树索引、B+树索引、哈希索引。其中InnoDB引擎采用的是B+数索引

二、索引的底层是什么 

MYSQL默认使用InnoDB存储引擎, 在InnoDB下的索引底层采用B+树数据结构存储引擎。

选用B+树主要有三个原因:

  • B+树对比B树更“矮胖”,阶数少,路径低,其扫描效率更高
  • B+树的读写代价低,非叶子节点只存放指针,叶子节点存放数据。mysql一页的大小是固定16kb的,对比B树的节点同时存放指针和数据,它可以存放更多的指针,一次性读取的数据量更多。
  • B+树的叶子节点通过双向链表维护,范围查找、排序查找、区间查找能力优秀

三、B+树和B树区别 

一、在B树中,非叶子节点和叶子节点都会存储数据,而B+树的数据只存放在叶子节点,非叶子节点只存放指针,查询效率更稳定

二、在范围查找时效率更高,B+树的数据都在叶子节存储,叶子节点之间通过双向链表维护

四、什么是聚集索引和非聚集索引 

聚集索引:索引和数据放在一块,b+数的叶子节点保存了整行数据,有且只有一个,一般情况用主键作为聚集索引

非聚集索引:索引和数据分开存储,b+数的叶子节点保存对应主键,可以有多个。一般自定义的索引都是非聚集索引

五、什么是回表查询 

回表的意思就是一次查询没有获得我们所需要的全部数据,可能只通过二级索引获得了主键值,需要使用该主键值回到聚集索引中重新查询到所有数据。

为避免回表,可以采用覆盖索引或者在聚集索引列上进行查询 

 六、什么是覆盖索引

覆盖索引:在select查询中,返回的数据在索引列上可以全部找到。比如我们通过id聚集索引进行查询,它的叶子节点上保存了整行数据,可以一次查询全部返回,查询效率高。

而如果所需返回的数据有部分不在索引列上,就可能触发回表机制。为了避免,查询时尽量不要使用select *,尽量在返回列中都包含添加索引的字段。 

七、怎么处理超大分页 

超大分页一般都是在数据量比较大时,我们使用了limit分页查 询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索 引和子查询来解决先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个 id列表中的数据就可以了 因为查询id的时候,走的覆盖索引,所以效率可以提升很多
 

八、创建索引的原则 

一般选择读的写少的字段创建索引。

尽量选择复合索引,一条sql的返回值尽量使用覆盖索引

较长的字段可以采用前缀索引 

你可能感兴趣的:(mysql,数据库)