mysql之索引组织表
1.二叉树/平衡树.B-tree.B+tree.B*tree
树:最上一层是根节点.最底下一层是叶子节点.(一般左边节点小于右边节点)
二叉树:每个节点最多只能有两个分支,一般只用于教材.二叉树的深度不可控,造成遍历数据时IO次数不可控.数据量大了,树的深度会太大. 二叉树的变种:BTREE(又写成B-tree),B+tree和B*tree. B-tree即balance-tree:平衡树:假设1个节点的子节点是5个,平衡树是必须上层节点都满了,才可加到下层.这样树的深度就得到了控制.B-tree除了在叶子节点保存数据,在非叶子节点也保存数据. B+tree:所有数据都存储在叶子节点,非叶子节点不存储数据.且叶子节点间构成了双向链表。Mysql用的方法是B+tree. b+tree的插入必须要保证插入后,叶子节点的数据依然有序。而且不管怎么变化,根节点到叶子节点的深度始终是相同的。 B*tree:也只在叶子节点存储数据并构成双向指针,但在非叶子节点有双向指针。 |
2.聚簇索引表(索引组织表cluster-index)
在建表时,innodb将表结构数据,存储在一个B+TREE中,B+TREE叫聚簇索引(cluster-index).以聚簇索引构建的表叫聚簇索引表,又称索引组织表。聚集索引页的叶子节点汇总存放着完整的记录,副主索引页中存放着指向叶子的指针。 聚集索引是通过将表的主键作为键值来构造B+树的,因为innoDB存储引擎是通过主键来构造的,所以这需要每一张表都有主键,如果没有显式的指定主键,那么数据库是自动创建主键,聚集索引不仅仅包含索引的键值,还包含了记录所在其他列的值,聚集索引中的记录是根据键值顺序排列的,但是不是物理排序,而是顺序排序。 说明: 1.根据主键寻址速度很快 2.主键值递增的insert插入效率较好 3.主键值随机insert插入操作效率差 建议:innodb表必须指定主键,最好使用自增数字; |
1.聚簇索引构建规则
1.存在主键的情况下,是用主键来构建聚簇索引.
2.在没有主键的情况下,如果有唯一性非空索引,就用该索引构建. 3.都没有,则开辟一个6字节的隐藏列,用隐藏列构建主键索引. |
2.聚簇索引的特点:
1. MySQL的表结构由聚簇索引来构建,表结构本身就是索引的一部分。
2.通过表的主键来键值来构造B+TREE,因为INNODB存储引擎是一个索引组织表,这意味着每张表都有一个主键,如果没有显示的创建,则innodb会创建一个六个字节的主键,聚簇索引不仅仅包含索引的键值,还包含了记录其他列的信息。 3.聚簇索引是根据键值顺序存放的,然而要特别注意的是这个顺序是指逻辑顺序,而不是物理上的存储顺序。因为如果是物理顺序那么排序开销是不被接受的。 4.聚簇索引的非叶子结点存储的是<</font>键值,地址>对。地址为指向下一层的指针,innoDB存储引擎通过页在表空间中的偏移量来表示。 5.创建表如果指定主键,那么会自动以指定的主键进行查询,互联网业务中,大多数的OLTP业务中,都是根据主键来查询数据,同时查询速度也是非常快的。 |
3.行数据库表的两大类(索引组织表和堆表)
索引组织表(聚簇索引表)—>MySQL默认表结构:表本身就是一个索引,数据按照主键的顺序来进行组织。 堆表(普通的堆表,数据块构成)—>ORACLE默认表结构(ORACLE也支持索引组织表,但是默认ORACLE的主键会默认创建索引)插入数据是随机的 |
4.聚簇索引叶子节点块
1.数据页读取到内存,所以对页的操作,首先是在内存中操作的,那么就造成一个问题,某一时间,内存和硬盘的数据页数据不一样,这是通过事务ACID来可以保证,某一个时间点两者的数据会到达最终一致性. 2.数据页在磁盘或者内存空间中,是一次性开辟的,里面的记录是顺序线性存放的(逻辑上的) 3.叶记录是根据主键顺序排列的,这个顺序是逻辑上的。 |
5.数据页定位数据记录的过程
在非叶子节点查找数据到叶子节点后,并无法定位数据,在数据页中有一部分叫做page directory,该部分记录了每个数据目录在数据页中的偏移量,知道偏移量后,进行二分法查找,就可以找到了具体的数据记录. |
6.索引优点与缺点
索引优点: 1.加快数据检索效率; 2.可以创建唯一性约束索引,保证数据库表中每一行数据的唯一性; 3.加速表和表连接效率; 4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。 说明: 1.索引可以优化DML操作的查询部分。 2. 索引提供了查询的可控性,全表查询IO不可控。 3. 索引查询一条数据的IO次数由索引的层数决定。 索引缺点: 1.索引需要占用更多物理存储空间。 2.当对表中的数据进行增加、删除和修改的时候,索引也要更新维护,降低了数据维护效率。 说明:1.尽量在表里不要有冗余索引。2.大数据入库时,可以先干掉索引,插入数据,然后重建索引。 |
7.索引分类
逻辑上: Single column indexes单列索引 Combined Indexes,Multiple-Column Indexes 多列索引 Unique 唯一索引 物理上: clustered index 聚簇索引 复合索引:(建立在多个列上的索引) |
8.哪些情况下建议创建索引:
· 经常需要搜索的列 · 作为主键的列,有唯一约束索引 · 经常用在表连接的列 |
3.辅助索引
辅助索引又称二级索引或非聚簇索引.
1.辅助索引存放的信息
辅助索引也是B+tree,叶子节点存放的是索引列和主键值,不存放其他列信息.若无主键,则存放的是索引列和该表聚簇索引的虚拟主键值.辅助索引是根据索引列的值排序. |
2.聚簇索引和辅助索引的选择
1. 在聚簇索引和辅助索引都存在的时候,优化器倾向于使用聚簇索引,因为聚簇索引可以通过叶子节点找到数据。
2. 通过辅助索引查询记录仅仅只能得到主键值,要查询完整的记录,还需要通过一次聚簇索引查询。(回表) 3. 仅仅当主键值发生改变的时候,需要更新辅助索引。(问题:索引列改变了难道不更新?) 4. 聚簇索引通常比辅助索引的高度要高(辅助索引不保存所有记录,更小,高度更低)。 |
4.索引覆盖、回表与复合索引
1.覆盖索引
覆盖索引:只需通过辅助索引就可以返回数据。 一个查询语句的执行只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。也可以称之为实现了索引覆盖。特高频SQL,强烈推荐使用覆盖索引,可以非常大的提高查询效率。 |
2.回表
指当通过辅助索引查询得到的记录信息不足,需要回表再通过聚簇索引查询信息. |
3.复合索引
复合索引:建立在多个列上的索引..
关于复合索引的使用:遵从最左前缀原则。如当复合索引列有3个时,where条件里是1或者1、2或者1、 2、 |
4.mysql的ICP(索引下推)和对where中过滤条件的处理
ICP:Index Condition Pushdown(索引下推)
ICP技术是在MySQL5.6中引入的一种索引优化技术。它能减少在使用二级索引过滤where条件时的回表次数和减少MySQL a 当关闭ICP时,index 仅仅是data b 当打开ICP时,如果部分where条件能使用索引中的字段,MySQL 优化效果:ICP能减少引擎层访问基表的次数和MySQL 对where中过滤条件的处理,根据索引使用情况分成了三种:index key, index filter, table 1. index 用于确定SQL查询在索引中的连续范围(起始范围+结束范围)的查询条件,被称之为Index 2. index 在使用 index 3. table where中的条件不能使用索引进行处理的,只能访问table,进行条件过滤了。也就是说各种各样的 where 条件,在进行处理时,分成了上面三种情况,一种条件会使用索引确定扫描的范围;一种条件可以在索引中进行过滤;一种必须回表进行过滤;所以所谓的 ICP 技术,其实就是 index |
5.索引添加删除语句
添加聚簇索引: alter table t1 add primary key (id); ---设置id为主键 添加辅助索引: alter table t1 add 删除索引: drop index in_a on |
6.索引扫描说明
在语句前加上explain.查看使用哪个索引.key字段的值为使用的索引名,rows字段的值为查询过程中扫描到的数据的行数.最后的Extra若是Using index,则说明是走覆盖索引.当查询一条或几条数据,使用了聚簇索引.key为primary. 当查询字段是辅助索引列时,走辅助索引.这种不是通过覆盖索引,故是先通过辅助索引再回表,通过聚簇索引查找数据. 覆盖索引:Using-index只需通过辅助索引就达到结果.没有通过聚簇索引,故是覆盖索引,key为辅助索引名称,Extra显示为Using |
7.唯一索引说明:
唯一(具有唯一约束的索引,唯一索引):唯一:不能有相同数据
alter table t add unique idx_t1(name). 添加唯一索引时,若该列值有重复,则不能添加.添加成功后,则该列有了唯一约束. |
8.索引的可选择性
索引选择性越高,索引的价值越高 索引可选择性的计算: show index from t1; 后会有一行Cardinality,是不重复记录的预估值(对列去重)。 使用Cardinality/rows就可以得到可选择率,越接近1,索引越高效,其值介于(0,1] 举例: 1. 字段‘gender’,可能有‘男’,‘女’,‘其他’三个值,索引的选择性为 3/1000 = 0.003 2. 字段id,每条记录都不同,索引选择性为1000/1000 = 那么查询id为123456且gender为‘女’的记录时应该使用哪个索引? 显然应该使用id字段上的索引,只要定位到这条索引记录,就可以立刻确定是否存在这条记录,然后再验证性别是否为‘女’,而使用‘gender’字段上的索引,可能需要遍历多条记录,对比id后才能确定是否存在这条记录. |
mysql之索引组织表的更多相关文章
- MySQL InnoDB 索引组织表 & 主键作用
InnoDB 索引组织表 一.索引组织表定义 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table IOT). 在Inno ...
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...
- 4. 跟踪标记 (Trace Flag) 610 对索引组织表(IOT)最小化日志
跟踪标记:610 功能: 用批量导入操作(Bulk Import Operations)加载数据时,对于索引组织表(即有聚集索引的表) 最小化日志: 上图为simple/bulk-logged恢复模式 ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
- mysql测试索引在表中的作用
//未完成 参考书:(完成对缓存中执行计划的查看对比 P133~) Microsoft SQL Server 2008技术内幕:T-SQL查询 实验内容 单表中的索引使用 1.建表 create ta ...
- mysql添加索引(建表之后)
一.使用ALTER TABLE语句创建索引 语法如下: alter table table_name add index index_name (column_list) ; alter table ...
- MySQL的索引单表优化案例分析
建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...
- 【mysql】索引 回表 覆盖索引 索引下推
索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...
- MySQL查看索引、表信息、触发器
查看索引: select * FROM information_schema.TABLE_CONSTRAINTS ; select * FROM information_schema.TABLE_CO ...
随机推荐
- js产生任意2个区间内的随机整数
var code = myRound(30,100); function myRound(begin,end){ var num = Math.round(Math.random()*(end-beg ...
- Jmeter请求之接口串联自动化测试(未完)
方案一:添加Cookie管理器,把用户的登录状态存在cookie管理器中,类似于浏览器 存储测试结果: 监听器->保存响应到文件,对结果进行存储 文件名前缀:保存到哪个地方前缀是什么D:\tes ...
- 【模拟】CF 796C Bank Hacking
题目大意 洛谷链接 给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权. 其他见链接(懒). PS:原题面很不好总 ...
- spring boot:用cookie保存i18n信息避免每次请求时传递参数(spring boot 2.3.3)
一,用cookie保存i18n信息的优点? 当开发一个web项目(非api站)时,如果把i18n的选择信息保存到cookie, 则不需要在每次发送请求时都传递所选择语言的参数, 也不需要增加heade ...
- linux(centos8):为prometheus安装grafana(grafana-7.0.3)
一,grafana的用途 1,grafana是什么? grafana 是用 go 语言编写的开源应用, 它的主要用途是大规模指标数据的可视化展现 它是现在网络架构/应用分析中最流行的时序数据展示工具 ...
- centos8安装fastdfs6.06(单机方式)
一,下载 fastdfs6.06 1,官方地址 https://github.com/happyfish100 2,说明:当前版本:共3个子模块 fastdfs v6.06 libfastcommon ...
- document.all.WebBrowser为空或不是对象
项目中也想用这个功能,发现出错,经过测试,一定要加<object id="WebBrowser" width=0 height=0 classid="CLSID:8 ...
- RocketMQ扫盲篇
本篇博客主要参考: <浅入浅出>-RocketMQ 敖丙 APACHE-RocketMQ Gitee RocketMQ官方文档 RocketMQ 实战与进阶 GitChat 又是好久没有写 ...
- 看完本文若不能让你学通“Python”,我将永远退出IT界
学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习.这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyt ...
- *新阿里镜像maven配置流程
解决idea中maven仓库下载jar包慢的问题 配置阿里镜像 设置idea 配置阿里镜像参考链接:https://blog.csdn.net/redhat0921/article/details/1 ...