- 浏览: 60612 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (117)
- RPC相关 (4)
- mvc_controller (3)
- mvc_model (3)
- maven (4)
- mvc_view (5)
- IO (2)
- 业务相关 (2)
- MQ (7)
- 搜索引擎 (3)
- zookeeper (2)
- 工具相关 (4)
- 编辑错误 (1)
- tomcat (1)
- 单元测试 (1)
- 负载均衡 (1)
- ubuntu (1)
- nginx (1)
- dubbo (2)
- 网络站点分发 (1)
- 电商-支付相关 (10)
- 电商订单业务相关 (3)
- Core java1 (3)
- Core Java (12)
- 多线程高并发(并发包/线程/锁) (10)
- 数据库+缓存 (17)
- springcloud (2)
- jvm (5)
- 日志相关 (1)
- 算法 (3)
- spring (2)
- 分布式一致性算法 (1)
最新评论
参考:https://www.cnblogs.com/yelongsan/p/9405914.html
参考带图:https://www.wengbi.com/thread_94416_1.html
技术内幕四维图:https://blog.csdn.net/tanliqing2010/article/details/81509539
看起来好像啥都知道,但让你说的时候可能就GG了:
Mysql支持Hash索引和B+树索引两种,具体说说看?
使用索引为什么可以加快数据库的检索速度啊?
为什么说索引会降低插入、删除、修改等维护任务的速度。
因为要保持平衡树
索引的最左匹配原则指的是什么?
Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗?
聚集索引和非聚集索引有什么区别?
1.mysql基本存储是页,页和页是双链表,页中每条记录之间是单链表。
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483701&idx=1&sn=bd229dd584f51ef4fe545d44ad8cdbf9&chksm=979688c7a0e101d1b5c752094013b78f5bd50ab905257ba82149d85d35ea07aba1a15b0e52b4&mpshare=1&scene=1&srcid=0409Tn66UYWSWvqEVlOpwGtR&key=6cd553e86912686a47d76f2d900b1b5b388c90b29708f016db3a6e1bcebe032220ba63626095c4298f32cda7d0d7bd11bded2365f05c32e522584dd149b98db0bb8549ef144cdca694665d31d35cfeef&ascene=0&uin=MzAzMjU4NDM3Nw%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.4+build(16E195)&version=12020810&nettype=WIFI&lang=zh_CN&fontScale=100&pass_ticket=YHEmqDDX8hHkj5FiSVpQvjYqIMBDHHDS2po4mfJe%2BqIXlqwJI%2Bg7aJUZq0%2BDwGJ0
没有用索引我们是需要遍历双向链表来定位对应的页。
建立索引实际上就是建立一颗B+树。
1)B+树是一颗平衡树,如果我们对这颗树增删改的话,那肯定会破坏它的原有结构。
2)要维持平衡树,就必须做额外的工作。正因为这些额外的工作开销,导致索引会降低增删改的速度
2.b+树理解
所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
https://www.cnblogs.com/wade-luffy/p/6292784.html
插入:涉及到主页和叶子页拆分合旋转
Leaf Page满了,一次拆分
Leaf Page和Index Page都满了,两次拆分
旋转发生在Leaf Page已经满了、但是其左右兄弟节点没有满的情况下
删除:
B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值。删除根据填充因子的变化来衡量。
填充因子小于50%,这时需要做合并操作。
填充因子,左右兄弟的节点占有整个空间的比例。填充因子:1-空余空间比例。
3.哈希索引理解
在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引
优点:
本质上就是把键值换算成新的哈希值,根据这个哈希值来定位。
如果是等值查询,那么哈希索引明显有绝对优势。
缺点:
哈希索引也没办法利用索引完成排序
不支持最左匹配原则
在有大量重复键值情况下,哈希索引的效率也是极低的---->哈希碰撞问题。
不支持范围查询
InnoDB支持哈希索引嘛:
mysqlInnoDB存储引擎 是支持hash索引的,不过我们必须启用,hash索引的创建由InnoDB存储引擎引擎自动优化创建(自适应的),我们干预不了。
4.聚集索引和非聚集索引
1)聚集索引在叶子节点存储的是表中的数据
2)非聚集索引在叶子节点存储的是主键和索引列
3)使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)
4)覆盖索引:非聚合组合索引的一种形式,把要查询出的列和索引是对应的,不做回表操作(要查询出的列在叶子节点都存在!所以,就不用回表了,比如创建了索引(username,age),在查询数据的时候:select username , age from user where username = 'Java3y' and age = 20。)
5.最左匹配原则
联合索引中,遇到范围查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。
例子:
如有索引(a, b, c, d),查询条件a = 1 and b = 2 and c > 3 and d = 4,则会在每个节点依次命中a、b、c,无法命中d。
6.意向锁(表的意向锁):
innodb中有行锁和表锁。
正常情况下,加了行锁,表锁需要查询每一行是否加了行锁,才进行加表锁成功。
这里,innodb有了意向锁的含义,在加行锁的同时加了表的意向锁,此时表锁只需要查询有没有意向锁就好。
https://www.zhihu.com/question/51513268
7.mvcc
数据快照
https://572327713.iteye.com/blog/2438247
可以从回答read_commmit,repeatable read实现原理得到答案:
read_commmit语句级快照,每次读取最新版本的快照;
repeatable read事务级别的快照,表里每个数据行都隐式有版本和过期时间的字段,一个事务来处理,会获取小于等于当前版本号的数据(数据快照)
8.gap锁间隙锁
比如操作5,表中有1和10 ,会锁住5到1和5到10的区间行锁,防止幻读。
在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。gap lock的机制主要是解决可重复读模式下的幻读问题
总结:
1)尽量选择区分度高的列作为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重复的比率,比率越大我们扫描的记录数就越少。
2)尽可能的扩展索引,不要新建立索引。比如表中已经有了a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
参考带图:https://www.wengbi.com/thread_94416_1.html
技术内幕四维图:https://blog.csdn.net/tanliqing2010/article/details/81509539
看起来好像啥都知道,但让你说的时候可能就GG了:
Mysql支持Hash索引和B+树索引两种,具体说说看?
使用索引为什么可以加快数据库的检索速度啊?
为什么说索引会降低插入、删除、修改等维护任务的速度。
因为要保持平衡树
索引的最左匹配原则指的是什么?
Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗?
聚集索引和非聚集索引有什么区别?
1.mysql基本存储是页,页和页是双链表,页中每条记录之间是单链表。
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483701&idx=1&sn=bd229dd584f51ef4fe545d44ad8cdbf9&chksm=979688c7a0e101d1b5c752094013b78f5bd50ab905257ba82149d85d35ea07aba1a15b0e52b4&mpshare=1&scene=1&srcid=0409Tn66UYWSWvqEVlOpwGtR&key=6cd553e86912686a47d76f2d900b1b5b388c90b29708f016db3a6e1bcebe032220ba63626095c4298f32cda7d0d7bd11bded2365f05c32e522584dd149b98db0bb8549ef144cdca694665d31d35cfeef&ascene=0&uin=MzAzMjU4NDM3Nw%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.12.4+build(16E195)&version=12020810&nettype=WIFI&lang=zh_CN&fontScale=100&pass_ticket=YHEmqDDX8hHkj5FiSVpQvjYqIMBDHHDS2po4mfJe%2BqIXlqwJI%2Bg7aJUZq0%2BDwGJ0
没有用索引我们是需要遍历双向链表来定位对应的页。
建立索引实际上就是建立一颗B+树。
1)B+树是一颗平衡树,如果我们对这颗树增删改的话,那肯定会破坏它的原有结构。
2)要维持平衡树,就必须做额外的工作。正因为这些额外的工作开销,导致索引会降低增删改的速度
2.b+树理解
所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
https://www.cnblogs.com/wade-luffy/p/6292784.html
插入:涉及到主页和叶子页拆分合旋转
Leaf Page满了,一次拆分
Leaf Page和Index Page都满了,两次拆分
旋转发生在Leaf Page已经满了、但是其左右兄弟节点没有满的情况下
删除:
B+树使用填充因子(fill factor)来控制树的删除变化,50%是填充因子可设的最小值。删除根据填充因子的变化来衡量。
填充因子小于50%,这时需要做合并操作。
填充因子,左右兄弟的节点占有整个空间的比例。填充因子:1-空余空间比例。
3.哈希索引理解
在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引
优点:
本质上就是把键值换算成新的哈希值,根据这个哈希值来定位。
如果是等值查询,那么哈希索引明显有绝对优势。
缺点:
哈希索引也没办法利用索引完成排序
不支持最左匹配原则
在有大量重复键值情况下,哈希索引的效率也是极低的---->哈希碰撞问题。
不支持范围查询
InnoDB支持哈希索引嘛:
mysqlInnoDB存储引擎 是支持hash索引的,不过我们必须启用,hash索引的创建由InnoDB存储引擎引擎自动优化创建(自适应的),我们干预不了。
4.聚集索引和非聚集索引
1)聚集索引在叶子节点存储的是表中的数据
2)非聚集索引在叶子节点存储的是主键和索引列
3)使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据。(拿到主键再查找这个过程叫做回表)
4)覆盖索引:非聚合组合索引的一种形式,把要查询出的列和索引是对应的,不做回表操作(要查询出的列在叶子节点都存在!所以,就不用回表了,比如创建了索引(username,age),在查询数据的时候:select username , age from user where username = 'Java3y' and age = 20。)
5.最左匹配原则
联合索引中,遇到范围查询(>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找。
例子:
如有索引(a, b, c, d),查询条件a = 1 and b = 2 and c > 3 and d = 4,则会在每个节点依次命中a、b、c,无法命中d。
6.意向锁(表的意向锁):
innodb中有行锁和表锁。
正常情况下,加了行锁,表锁需要查询每一行是否加了行锁,才进行加表锁成功。
这里,innodb有了意向锁的含义,在加行锁的同时加了表的意向锁,此时表锁只需要查询有没有意向锁就好。
https://www.zhihu.com/question/51513268
7.mvcc
数据快照
https://572327713.iteye.com/blog/2438247
可以从回答read_commmit,repeatable read实现原理得到答案:
read_commmit语句级快照,每次读取最新版本的快照;
repeatable read事务级别的快照,表里每个数据行都隐式有版本和过期时间的字段,一个事务来处理,会获取小于等于当前版本号的数据(数据快照)
8.gap锁间隙锁
比如操作5,表中有1和10 ,会锁住5到1和5到10的区间行锁,防止幻读。
在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身。gap lock的机制主要是解决可重复读模式下的幻读问题
总结:
1)尽量选择区分度高的列作为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重复的比率,比率越大我们扫描的记录数就越少。
2)尽可能的扩展索引,不要新建立索引。比如表中已经有了a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
发表评论
-
msql主从同步机制
2019-04-12 17:08 335DB主从分离:主服务 更新有线程记录mysq 的blog记录文 ... -
mysql原理分析(可用于培训)
2019-03-29 19:59 3181 ... -
redis主从同步/复制
2019-03-08 14:17 339redis主从是如何同步的 先说已经执行过首次同步(salvo ... -
数据库死锁&数据库锁知识点
2019-02-28 17:28 459参考:https://www.cnblogs.co ... -
redis 在业务代码应用
2018-08-02 16:30 5631.查库存 public class IndexDatas ... -
redis被动缓存
2018-04-04 18:45 517package com.pingan.haofang.ag ... -
本地缓存类
2018-04-04 18:44 353package com.pingan.haofang.ag ... -
缓存集中形式
2018-03-31 17:11 3531.被动缓存 被动缓存: 当取service服务数据redis ... -
分布式事务
2018-01-25 20:37 953事务 原子性,事务要么全执行,要么全不执行。 一致性,事务开 ... -
数据库死锁
2017-12-26 11:35 333死锁(Deadlock) 所谓死 ... -
redis sentinel & cluster 原理分析
2017-03-20 17:03 402[img][/img]http://lib.csdn.net/ ... -
redis sentinel:使用Spring-data-redis操作Redis的Sentinel
2017-03-20 10:22 654redis整合spring(redisTemplate工具类) ... -
mysql服务端安装(centos)
2017-03-02 18:10 417http://jingyan.baidu.com/articl ... -
redis cluster:缓存数据库Redis集群搭建
2016-12-19 22:39 522http://www.redis.cn/topics/clus ... -
mysql服务端与客户端安装(windows)
2016-12-02 11:23 832一.服务端安装5.7版本(zip的方式) 1.下载zip文件 ... -
mysql性能优化与ORM分库分表
2016-12-01 21:08 1339http://www.cnblogs.com/gossip/ ...
相关推荐
数据库索引设计与优化是数据库管理系统中至关重要的一个环节,它直接影响到数据查询的效率、存储空间的使用以及系统的整体性能。在这个主题中,我们将深入探讨数据库索引的基础概念、设计原则、优化策略以及实际应用...
数据库索引重建及修复语句
数据库索引设计原则 数据库索引设计原则是 Oracle 数据库管理系统中的一项重要技术,旨在提高数据库的查询效率和性能。以下是数据库索引设计原则的详细解释。 一、基本原则 数据库索引设计原则的基本原则是确保...
高清完整版 数据库索引设计与优化 高清完整版 数据库索引设计与优化
《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地...
《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地...
数据库索引技术是数据库管理系统中的核心组成部分,它极大地提高了数据查询效率,使得在海量数据中查找特定信息变得迅速。下面将分别对标题和描述中提到的各个知识点进行详细阐述。 首先,我们来看“文件记录的组织...
### 数据库索引及优化详解 #### 一、数据库索引的重要性 数据库索引就像是图书中的目录,能够显著提升查询速度。例如,在执行查询 `SELECT * FROM table1 WHERE id = 44` 时,如果没有索引,系统需要逐行扫描整个...
数据库索引是数据库管理系统中用于加速数据检索的一种数据结构,它的设计目的是为了提高查询效率,减少数据访问的时间。本文将深入探讨数据库索引的概念、B-Tree数据结构以及索引的分类和作用。 首先,B-Tree是...
【数据库索引】是数据库管理系统中用于加速数据检索的一种数据结构。索引好比书籍的目录,能够快速定位到所需的数据行。根据物理存储方式,索引分为【聚簇索引】和【非聚簇索引】。聚簇索引是按照数据的实际存储顺序...
《Oracle与MySQL数据库索引设计与优化》这本书深入探讨了两个主流关系型数据库管理系统——Oracle和MySQL中的索引设计和优化策略。索引是数据库性能的关键因素,它们能够加速数据检索,提高系统效率,尤其在大数据量...
数据库索引作为数据库管理系统(DBMS)中的关键技术之一,其作用在于优化数据的检索速度和确保数据的唯一性。本文将深入探讨数据库索引的优缺点,以及如何在实际操作中合理地运用索引来提升数据库性能。 ### 数据库...
### 空间数据库索引技术的深度剖析 #### 核心知识点提炼: - **空间数据库索引技术的重要性**:空间数据库索引技术是提升空间数据库存储效率与空间检索性能的关键,尤其在处理大规模空间数据时更为显著。传统索引...
### Oracle数据库索引的维护 在Oracle数据库管理与优化的过程中,索引的维护是非常关键的一环。合理地创建、管理和优化索引能够显著提高查询性能,降低系统的响应时间,从而提升整个应用程序的效率。本文将从Oracle...