mysql索引

BTree和B+Tree详解(转)

倾然丶 夕夏残阳落幕 提交于 2020-02-17 11:56:49
B+树索引是B+树在 数据库 中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。 二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次 二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造: 但是这棵二叉树的查询效率就低了。因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义——平衡二叉树,或称AVL树。 平衡二叉树(AVL Tree) 平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1; 如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡

MySQL索引面试题分析

和自甴很熟 提交于 2020-02-17 11:26:22
MySQL索引面试题分析 话不多说,先建立一个表testTable,其中id为自增主键 在c1,c2,c3,c4上建立符合索引索引 CREATE INDEX idx_testTable_c1234 ON testTable ( c1 , c2 , c3 , c4 ) ; 现在的题目是:根据以下SQL分析索引使用的情况 1. SELECT * FROM testTable WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 = 'a4' ; 2. SELECT * FROM testTable WHERE c4 = 'a4' AND c3 = 'a3' AND c2 = 'a2' AND c1 = 'a1' ; 首先我们用explain语句来分析一下1,2条SQL语句 EXPLAIN SELECT * FROM testTable WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 = 'a4' ; EXPLAIN SELECT * FROM testTable WHERE c4 = 'a4' AND c3 = 'a3' AND c2 = 'a2' AND c1 = 'a1' ; 在这里我们看到它们的结果都是一样的,这是为什么呢? 其实,在MySQL逻辑架构中

构建高并发高可用的电商平台架构实践

為{幸葍}努か 提交于 2020-02-17 07:25:52
一、 设计理念 1. 空间换时间 1) 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回body,客户端可以继续用cache,减少流量),ETag) 反向代理缓存 应用端的缓存(memcache) 内存数据库 Buffer、cache机制(数据库,中间件等) 2) 索引 哈希、B树、倒排、bitmap 哈希索引适合综合数组的寻址和链表的插入特性,可以实现数据的快速存取。 B树索引适合于查询为主导的场景,避免多次的IO,提高查询的效率。 倒排索引实现单词到文档映射关系的最佳实现方式和最有效的索引结构,广泛用在搜索领域。 Bitmap是一种非常简洁快速的数据结构,他能同时使存储空间和速度最优化(而不必空间换时间),适合于海量数据的的计算场景。 2. 并行与分布式计算 1) 任务切分、分而治之(MR) 在大规模的数据中,数据存在一定的局部性的特征,利用局部性的原理将海量数据计算的问题分而治之。 MR模型是无共享的架构,数据集分布至各个节点。处理时,每个节点就近读取本地存储的数据处理(map),将处理后的数据进行合并(combine)、排序(shuffle and sort)后再分发(至reduce节点),避免了大量数据的传输,提高了处理效率。 2) 多进程、多线程并行执行

构建高并发高可用的电商平台架构实践

我们两清 提交于 2020-02-17 07:05:25
从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流。 转载请声明出处: http://blog.csdn.net/yangbutao/article/details/12242441 作者:杨步涛 关注分布式架构、大数据、搜索、开源技术 QQ:306591368 技术Blog: http://blog.csdn.net/yangbutao 一、 设计理念 1. 空间换时间 1) 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回body,客户端可以继续用cache,减少流量),ETag) 反向代理缓存 应用端的缓存(memcache) 内存数据库 Buffer、cache机制(数据库,中间件等) 2) 索引 哈希、B树、倒排、bitmap 哈希索引适合综合数组的寻址和链表的插入特性,可以实现数据的快速存取。 B树索引适合于查询为主导的场景,避免多次的IO,提高查询的效率。 倒排索引实现单词到文档映射关系的最佳实现方式和最有效的索引结构,广泛用在搜索领域。 Bitmap是一种非常简洁快速的数据结构,他能同时使存储空间和速度最优化(而不必空间换时间),适合于海量数据的的计算场景。 2. 并行与分布式计算 1) 任务切分、分而治之

构建高并发高可用的电商平台架构实践

时间秒杀一切 提交于 2020-02-17 06:44:57
从各个角度总结了电商平台中的架构实践,由于时间仓促,定了个初稿,待补充完善,欢迎大家一起交流。 转载请声明出处: http://blog.csdn.net/yangbutao/article/details/12242441 作者:杨步涛 关注分布式架构、大数据、搜索、开源技术 QQ:306591368 技术Blog: http://blog.csdn.net/yangbutao 一、 设计理念 1. 空间换时间 1) 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回body,客户端可以继续用cache,减少流量),ETag) 反向代理缓存 应用端的缓存(memcache) 内存数据库 Buffer、cache机制(数据库,中间件等) 2) 索引 哈希、B树、倒排、bitmap 哈希索引适合综合数组的寻址和链表的插入特性,可以实现数据的快速存取。 B树索引适合于查询为主导的场景,避免多次的IO,提高查询的效率。 倒排索引实现单词到文档映射关系的最佳实现方式和最有效的索引结构,广泛用在搜索领域。 Bitmap是一种非常简洁快速的数据结构,他能同时使存储空间和速度最优化(而不必空间换时间),适合于海量数据的的计算场景。 2. 并行与分布式计算 1) 任务切分、分而治之

Mysql联合索引的数据结构(B+Tree)

ぃ、小莉子 提交于 2020-02-17 02:09:33
B+Tree中的data存储last_name,first_name,dob三个字段信息,类似于一个主键索引的中的一个字段,将三个字段组合在一起,比较的时候和单独的一个字段的区别在于,先比较last_name,然后比较first_name,最后再比较dob,执行这样的规则。 综上所述:这样就比较好理解Mysql索引的最左前缀原理 来源: CSDN 作者: 社交恐惧的岛主 链接: https://blog.csdn.net/a1_HelloWord/article/details/104349335

MySQL 索引学习笔记

只谈情不闲聊 提交于 2020-02-15 11:54:33
该文为《 MySQL 实战 45 讲》的学习笔记,感谢查看,如有错误,欢迎指正 一、索引简介 索引就类似书本的目录,作用就是方便我们更加快速的查找到想要的数据。 索引的实现方式比较多,常见的有 哈希表 , 有序数组 , 搜索树 。 1.1 哈希表 哈希表 是将数据以 key-value 的形式存储起来,简单来说就是将 key 通过哈希函数换算成数组中的一个确定的位置,将 value 存到这个位置去。当 key 比较多时,有可能换算出相同的位置,此时可以通过链表来解决。在查询时先找到位置,再对该位置的多个 value 进行遍历。 哈希表适合用于等值查询 ,由于是无序的,不适合用来做区间查询。 1.2 有序数组 有序数组 在等值查询和区间查询上效率都很高。由于是有序的,可以通过二分法快速得到结果。也支持范围查询。但是也有一个缺点,如果要在中间插入一个数据,那么后面的所有记录都要向后挪一位,成本太高了。 因此, 有序数组只适用于静态存储引擎 。 例如我们要保存2019年的出生人口信息,就适合用有序数组。 1.3 搜索树 常见的搜索树有 二叉 ,也有 多叉 。 二叉树 的特点是: 每个节点的左儿子小于父节点,父节点又小于右儿子。 多叉树 的特点是: 每个节点有多个儿子,儿子之间的大小保证从左到右递增。 由于索引不止存在内存中,还会写到磁盘上,而读磁盘越多,查询效率越慢

Mysql索引查询失效的情况

我的未来我决定 提交于 2020-02-14 12:14:54
首先,复习一下索引的创建: 普通的索引的创建: CREATE INDEX (自定义)索引名 ON 数据表(字段); 复合索引的创建: CREATE INDEX (自定义)索引名 ON 数据表(字段,字段,。。。); 删除索引:DROP INDEX 索引名; 以下通过explain显示出mysql执行的字段内容: id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符. select_type: SELECT 查询的类型. table: 查询的是哪个表 partitions: 匹配的分区 type: join 类型 possible_keys: 此次查询中可能选用的索引 key: 此次查询中确切使用到的索引. ref: 哪个字段或常数与 key 一起被使用 rows: 显示此查询一共扫描了多少行. 这个是一个估计值. filtered: 表示此查询条件所过滤的数据的百分比 extra: 额外的信息 索引查询失效的几个情况: 1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。 2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效 3、组合索引,不是使用第一列索引,索引失效。 4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型

数据库MySQL:B+ Tree

匆匆过客 提交于 2020-02-14 01:27:49
索引 加速查询的数据结构 索引常见数据结构 顺序查找:time: O(n),大数据量此算法效率糟糕。 二叉树查找:time:O(logn),二叉查找树可能不平衡。 hash索引:time:O(1),无法满足范围查找。 红黑树:time:O(h) = O(logn) B Tree B+ Tree 来源: https://www.cnblogs.com/xiaobaizzz/p/12306028.html

MySQL explain命令详解

为君一笑 提交于 2020-02-13 21:02:30
使用explain + sql语句可以得到该条sql语句的执行计划,具体信息如下 下面将依次介绍每个字段的含义 id id表示在多表查询时,表的执行顺序,它是一组数字序列号,表示查询中执行select子句或操作表的顺序,其取值分为以下三种情况 1.id相同,表示表的执行顺序由上至下 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t1,再查询t3,最后查询t3 2.id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t3,再查询t2,最后查询t1 3.id有相同值也有不同值,id值越大越先被执行,id值相同自上而下顺序执行 上例中,t3表最先被查询,第二个被查询的并不是一张真实的表,而是一张衍生表derived2,它是表t3的查询结果,也就是将上一步中t3的查询结果作为一张表来进行查询,该衍生表的命名方式是derived+2(2 表示由 id =2 的查询衍生出来的表)。最后被查询的表是t2。 select_type select_type表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询,其值主要有以下几种情况 1.SIMPLE:简单的 select 查询,查询中不包含子查询或者UNION,实例如下 2.PRIMARY:查询中若包含任何复杂的子部分