mysql-索引

索引

目的:为了提高数据库的查询速度,就像书的目录一样。
索引的常见模型:
哈希表:哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
解决哈希冲突的办法:链表法
适用场景:哈希表这种结构适用于只有等值查询的场景
有序数组:有序数组在等值查询和范围查询场景中的性能就都非常优秀
适用场景:有序数组索引只适用于静态存储引擎
二叉树:二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子。
二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉
树。其原因是,索引不止存在内存中,还要写到磁盘上。
InnoDB索引模型
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+树中的。
索引类型分为主键索引和非主键索引
主键索引叶子节点存储的是整行数据,在innodb里,主键索引也叫聚簇索引。
非主键索引,叶子节点内容是主键的值,在InnoDb里,非主键索引也叫二级索引。
非主键索引的查询多扫描一颗索引树,我们在应用尽量使用主键查询。
索引维护:
自增主键:是指在自增列上定义的主键,在建表语句中,not null primary key auto_increment.
主键长度越小,普通索引叶子节点越小,普通缩影占用的内存空间越小.
小结:B+ 树能够很好地配合磁盘的读写特性,减少单次查询的
磁盘访问次数。
覆盖索引:
如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的
值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。
由于覆盖索引可以减少树的搜索次数,显著提升性能,使用覆盖索引是我们性能优化的一个常用手段.
最左前缀原则:
B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。
在建立索引的时候,如何安排索引内的字段顺序?
第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
索引下推:
索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数.

你可能感兴趣的:(mysql)