一:索引的常见模型

1.哈希表(key-value)存储的数据结构

缺点:hash索引在做区间查询时,速度慢。

优点:hash索引很适用于等值查询的场景,比如memcached以及其他一些nosql引擎。

2.有序数组

优点:有序数组在等值查询和范围查询的场景中,性能都非常优秀。

如果仅仅看查询效率,有序数组是最好的数据结构。

缺点:更新数据时成本太高。

总结:有序数组只适用于静态存储引擎。

3.m叉搜索树

二:InnoDB的索引模型

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

根据叶子节点的内容,索引分为主键索引和非主键索引。主键索引的叶子节点存储的是整行数据,在innoDB里,主键索引也被称为聚族索引(clustered index)。

非主键索引的叶子节点内容是主键的值。在innoDB里,非主键索引被称为二级索引(secondary index)。

基于主键索引和普通索引的查询,有什么区别?

如果语句是:select * from T where id = 500,主键查询方式,只需要搜索id这颗B+树;

如果语句是:select * from T where k = 5,普通索引查询方式,需要先搜索K索引树,得到id的值为500,再到id索引树搜索一次。这就是回表。

三:索引维护

如果某记录所在的数据页已经满了,根据B+树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去,这个过程为页分裂。这种情况下,性能会受到影响。

除了性能之外,页分裂还能影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低了50%。

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

除了考虑上面的性能,还可以从存储空间来看。比如表中有个唯一字段,如果我们是uuid,那么非主键的叶子节点都是主键的值,每个二级索引的叶子节点占用了36个字节,

但如果用整型当作主键,只需要4个字节,如果长整型,那也只有8个字节。

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

mysql索引的选择的更多相关文章

  1. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  2. MySQL索引选择及规则整理

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  3. 表数据量影响MySQL索引选择

    现象 新建了一张员工表,插入了少量数据,索引中所有的字段均在where条件出现时,正确走到了idx_nap索引,但是where出现部分自左开始的索引时,却进行全表扫描,与MySQL官方所说的最左匹配原 ...

  4. MySQL多索引查询选择

    MySQL多索引查询选择 MySQL选择索引-引入 我们知道我们一个表里面可以有多个索引的,那么我们查询数据的时候不指定索引,MySQL就会帮我们自动选择.既然是MySQL程序帮我们自动选择的那么会不 ...

  5. MySQL索引选择及添加原则

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  6. 五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》

    系列文章 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的 ...

  7. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  8. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  9. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. 5.1JAVA基础复习——JAVA中的静态代码块、构造代码块、构造函数、局部代码块区别

    构造代码块: 在类中定义可以给所有对象进行初始化.局部代码块: 在方法中定义属性的生命周期.静态代码块: 在类中定义用于给类调用时属性的初始化 构造函数与构造代码块的区别: 构造函数是给对应的对象进行 ...

  2. 如何在Idea提交代码到Github上

    一,配置账户 1. Setting >> Version Control >> git,配置git的安装目录(一般默认识别),其他参数不变 2.配置GitHub账户,输入Git ...

  3. Jenkins 配置git

    点击"新建任务"创建一个自用风格的项目 点击"源码管理",选择 git 系统管理 --> Global Tool Configuration<为访问 ...

  4. BIOS备忘录之SPI(fingerprint)设备

    Reset和INT信号使用的是GPIO功能,需要显式的使用(INT信号使用了GPIO的int number,RST信号使用了GPIO的absolute number): 问题举例 漏电导致功能异常:在 ...

  5. 创建作业(JOB)

    在SQL Server日常需求处理中,会遇到定时执行或统计数据的需求,这时我们可以通过作业(JOB)来处理,从而通过代理的方式来实现数据的自动处理.一下为SQL Server中创建作业的脚本,供大家参 ...

  6. SpringBoot服务器部署

    注释本地tomcat jar包 jdk版本必须1.8以上 tomcat版本必须8以上 配置tomcat server.xml文件 Swagger 配置

  7. shell编程(五)之函数

    function:函数 函数只有被调用才会执行如何调用:给定函数名 函数名出现的地方,会被自动替换为函数代码 函数的生命周期:被调用时创建,返回时终止return命令返回自定义状态结果 0:成功 1- ...

  8. Bytom的链式交易和花费未确认的交易

    当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况.多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账.那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代 ...

  9. opencv dlib caffe 安装

    编译opencv记录 1.opencv,opencv_contrib包, 3.4.5版本 2. 到opencv/build 目录下 删除所有文件 $rm -rf * 3. 打开cmake图形界面 $c ...

  10. Lintcode85-Insert Node in a Binary Search Tree-Easy

    85. Insert Node in a Binary Search Tree Given a binary search tree and a new tree node, insert the n ...