数据库索引

1. 为什么要使用索引
  1. 全表扫描,很慢,数据量小适合。
  2. 索引,例字典。关键信息组成了索引。
2. 什么样的信息能成为索引

主键,唯一键,普通键

3. 索引的数据结构
  1. 生成索引,建立二叉查找树进行二分查找,及其变种,平衡树,红黑树,查询中,每一个数据都会进行IO操作,IO次数多会比较慢
  2. 生成索引,建立B-Tree结构进行查找
    B-Tree:根节点至少包含两个孩子,树中的每个节点最多含有m个孩子。(m>=2);除根节点和叶子接节点外,其他每个节点至少由ceil(m/2) 个孩子,所有叶子节点都在同一层。尽可能存储更多信息,进可能减少IO次数。
  3. 生成索引,建立B±Tree结构进行查找
    B+ Tree是B树的变体,其定义基本与B树相同,除了:
    非叶子节点的子树指针和关键字数目相同,比B Tree能存储更多的信息
    非叶子节点的字数指针P[i],指向关键字值[K[i], K[i+1]]的子树
    非叶子节点仅用来做索引,数据都保存在叶子节点中
    所有叶子节点均有一个链指针指向下一个叶子节点,并按大小顺序连接

B+Tree更适合用来做存储索引,原因:1. B+树的磁盘读写代价更低(中间节点不存放数据,可以把这些索引的数据更多的放到内存,减少IO次数),B+数的查询效率更加稳定(每一次查询都要从根节点到叶子节点的路,所以每一次查询效率几乎都是一样的);B+树更有利于对数据库的扫描(只对叶子节点遍历就可完成扫描,对范围查询有着跟高的性能。

  1. 生成索引,建立hash结构结构进行查找,经过一次hash运算就能找到,理论上高于B+树;但是本身由于特殊性,仅仅满足于=,不能使用in,不能使用范围查询。无法被用来避免数据的排序操作,不能利用部分索引键查询,不能避免表扫描,遇到大量hash值相等的情况后性能不一定比B+树高。
  2. BitMap索引
4. 索引模块

密集索引和稀疏索引的区别:

  1. 密集索引:文件中的每个搜索码值都对应一个索引值
  2. 稀疏索引:只为索引码的某些值建立索引值
5. 索引如何优化sql
  1. 根据查慢日志定位慢查询
  2. explain 等解析工具分析sql
    Explain 关键字段:
    2.1 type
    system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>>unique_subquery>index_subquery>range>index>all
    如果type字段显示的是index或all表明本次查询使用的是全表扫描。当我们查询语句是慢查询语句,并且type字段是两个中的一个的话,表明语句是需要优化的。
    2.2 extra
    extra中出现以下2项意味着mysql根本不能使用索引,效率会受到重大影响,应尽可能对此进行优化。
extra项说明
Using filesort表示MySql会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序,MySql中无法利用索引完成的排序操作称为“文件排序”
Using temporary表示MySql在对查询结果排序时使用临时表,常见于排序order by 和分组group by

3.修改sql,或者尽量让这条sql语句使用索引(添加索引)。

6.联合索引的最左匹配原则的成因
7. 索引是建立的越多越好吗?

不是,

  1. 数据量小的表不需要建立索引,建立会增加额外的索引开销
  2. 数据变更需要维护索引,因此更多的索引意味着更多的维护成本
  3. 更多的索引以为着也需要更多的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值