写点什么

MySQL 数据库索引

作者:技术小生
  • 2022 年 7 月 23 日
  • 本文字数:833 字

    阅读完需:约 3 分钟

MySQL数据库索引

索引是数据库为提高数据库查询效率的数据结构


MySQL 有哪些情况不走索引?

  1. 索引列参与计算;

  2. 索引列使用了函数;

  3. 匹配值使用了前百分号;

  4. 字符串和数字比较;

  5. 没有遵循联合索引的最左前缀原则;

  6. 引擎认为全表扫描比使用索引的代价更低

索引的三种数据模型

  1. 哈希表:哈希表这种结构适用于只有等值查询的场景 MemCached 等 NoSQL 引擎

  2. 有序数组:有序数组在等值查询和范围查询场景中的性能就都非常优秀。使用二叉树的原理。时间复杂度是 O  logN;但是对于更新来说,效率比较底,所以有序数组索引只适用于静态存储引擎。

  3. 搜索树:二叉树->平衡二叉树->平衡 N 叉树

关于 B+Tree

每一个索引在 InnoDB 里面对应一棵 B+树。

根据叶子节点的内容,索引的类型又分为主键索引和非主键索引

  • 主键索引   叶子节点存储的是整行数据,InnoDB 中,主键索引也称聚簇索引(Clustered Index)

  • 非主键索引  叶子节点存储的是主键的值。InnoDB 中,非主键索引也称二级索引(Seconday Index)

主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小(ID 做主键)

B Tree(B-Tree)和 B+Tree 的区别:

B+Tree:

  1. 所有的叶子结点使用链表相连,便于区间查找和遍历。B 树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有 B+树好。

  2. b+树的中间节点不保存数据,能容纳更多节点元素。

B-Tree

B 树的每一个节点都包含 key 和 value,因此经常访问的元素可能离根节点更近,因此访问也更迅速

索引示例

create table T(id int primary key,k int not null,name varchar(16),index (k))engine=InnoDB;
复制代码

R1~R5 的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6)

select * from T where ID=500   和  select * from T where k=5 区别


总结

在实际工作中,索引用处很大。所以,在工作中,我一般都是建好表先不建索引,而是在测试中查看下具体的执行 SQL。根据具体业务来建立对应的索引,因为 MySQL 在执行的时候会选择一个自认为最合适的索引,所以能建立联合索引就建立联合索引,这是用空间换时间的一种方式。

发布于: 7 小时前阅读数: 13
用户头像

技术小生

关注

业务应用架构专家 2019.10.08 加入

主要负责公司内部系统的应用架构设计与落地。擅长Java语言开发,熟悉Python、Shell等。精通K8S等云原生相关技术。

评论

发布
暂无评论
MySQL数据库索引_索引_技术小生_InfoQ写作社区