索引常见模型:

哈希表:适用于等值查询,区间查询速度很慢

有序数组:等值,区间查询性能优秀,适用与静态搜索引擎。 (更新成本高)

搜索树:N叉树应用为主(减少树高和磁盘交互次数),InnoDB B+树。

其他:跳表,LSM树等

哈希表结构

哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很

简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。

不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表

哈希表示意图

有序数组示意图

二叉搜索树示意图

InnoDB 的索引模型

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

InnoDB 的索引组织结构

主键索引的叶子节点存的是整行数据,也叫聚簇索引(InnoDB中)

非主键索引的叶子节点内容是主键的值。

基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

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

所以自增主键往往是合理的选择。

重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,索引更紧凑,更省空间。

主键索引只能重新建表才能重建索引。(钱的教训)删除数据,索引还在,索引树还是会很大。

覆盖索引

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

如果现在有一个高频请求,要根据市民的身份证号查询他的姓名,这个联合索引就有意义了。它可以在这个高频请求上用到覆盖索引,不再需要回表查整行记录,减少语句的执行时间。

当然,索引字段的维护总是有代价的。因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑了。这正是业务 DBA,或者称为业务数据架构师的工作。

最左前缀原则

这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。

索引下推

而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

mysql> select * from tuser where name like '张 %' and age=10 and ismale=1;

无索引下推执行流程

索引下推执行流程

深入浅出mysql_深入浅出mysql索引相关推荐

  1. gulp mysql_关于MySQL索引的一点小见解

    索引: 优缺点: 1.用的合理可以提高查询效率 2.建立过多索引会占用物理和数据空间,同时也会降低插入和更新效率 需不需要建立索引: 1.一般表的数据低于2000条就不用建立索引了,超过2000条酌情 ...

  2. 二叉树存储结构 mysql_为什么mysql索引选择b+树作为底层存储结构?

    这篇文章解决一个问题mysql 底层为什么是用b+树作为存储结构?为什么不是二叉树,红黑树,b树? 我们先构造一个应用场景,我们有1kw的数据需要存储在一张表里面,那么我们怎么设计能让查询速度尽可能的 ...

  3. 深入浅出PHP&MySQL(影印版)

    查看书籍详细信息: 深入浅出PHP&MySQL(影印版) 内容简介 准备好把你的静态HTML网页提升到下一个层次并使用:PHP和IMySQL建立数据库驱动的网站了吗?<深入浅出PHP&a ...

  4. R树 mysql_为什么MySQL使用B+树作为索引

    前言 本文是在讲述什么样的数据结构适合作为索引,以及其适合作为索引的原因.而阅读本文需要对B树和B+树结构有稍微的理解.以及需要对磁盘操作知识有稍微的了解.对于磁盘操作的相关知识,在文章尾部的链接文章 ...

  5. 索引 mysql_深入理解MySQL索引

    前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引.事务.数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重. 可能你了解索引的底层是b+树,会加快 ...

  6. using b tree mysql_浅析MysQL B-Tree 索引

    B-Tree 索引 不同的存储引擎也可能使用不同的存储结构,i如,NDB集群存储引擎内部实现使用了T-Tree结构存储这种索引,即使其名字是BTREE:InnoDB使用的是B+Tree. B-Tree ...

  7. MySQL索引(二)索引优化方案有哪些

    在上一篇文章中,我们介绍了MySQL中常见的索引类型以及每种索引的各自特点,那么这篇文章带你来与我一起看一下聚集索引与二级索引的关系,最后在附上常见的索引优化方案.首先我们还是看一下聚集索引和二级索引 ...

  8. 2.MySQL索引优化

    索引优化分析 性能下降,SQL慢.执行时间长.等待时间长 数据过多--分库分表 关联太多的表,太多join--SQL优化 没有充分利用到索引 --索引建立 服务器调优及各个参数设置--调整my.cnf ...

  9. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

最新文章

  1. 用Cordova打包Vue-vux项目
  2. pat 乙级 1017 A除以B(C++)
  3. 发布一个jQuery插件:formStorage
  4. MYSQL中什么是规范化_如何规范化SQL数据库
  5. 前端异步编程之Promise和async的用法
  6. mysql关于时间的面试题_关于面试中的mysql试题1
  7. mysql如何给一个数据库所有表都增加一个字段?
  8. Nginx#Nginx-Typora笔记
  9. 【技术】DTEmpower核心功能技术揭秘(3) - HDDV高维数据可视化技术
  10. python二元函数图像在线绘制_numpy,matplotlib
  11. python中执行py文件出错(提示File “stdin”,line 1,SyntaxError:invalid syntax)
  12. 魔兽私服Trinitycore架构设计分析之一
  13. 版本控制工具VSS使用介绍
  14. 土方工程量计算表格excel_土石方计算电子表格
  15. 论文写作Word技巧
  16. 2021年JAVA面试~光头佳的论述
  17. 使用XXLjob中间件进行定时任务的管理
  18. H.266/VVC的编码结构和块划分
  19. 面试官:说说微信小程序的登录流程?
  20. java编写周易demo

热门文章

  1. redis的发布和订阅模式
  2. MapWinGis入门
  3. u-boot之u-boot.bin的生成
  4. 据说被称为世上最经典的25句话!
  5. 浙江水利水电学院计算机管理办法,浙江水利水电学院校级重点学科建设管理办法-科技处.PDF...
  6. Linux 下 Tomcat Https
  7. 【转载】深入理解Java内存模型——final
  8. switch case异常处理机制
  9. 数组的常用方法 Array;
  10. 转:Dilphi基础教程