面试数据库
总结面试中数据库的知识
ProLayman
这个作者很懒,什么都没留下…
展开
-
高性能MySQL(3th)(第六章 sql优化) —— 07 执行引擎层面的连接运算
关于连接运算——内连接,左外,右外,全外,自然连接在语法上的区别,从结果来看的区别。这个这里就不再赘述,可以参考: XXXXX 本文要探究的是,在存储引擎层面,这些连接都干了些什么,以及它们的区别,这为我们以后做优化打下基础(先了解原理,然后考虑优化)。 ...原创 2019-11-01 21:15:30 · 131 阅读 · 0 评论 -
数据库基础问答(一) —— 为什么B+树更适合做文件索引和数据库索引
其实现有两个背景: 1. B+树本质是棵平衡m叉树,而平衡树就是解决一般多叉树失衡导致性能退化为线性的问题而生的,除了B+树,还有很多平衡树,AVL,红黑树,B树等等。 2.,现实应用中,大多数的文件系统索引和数据库索引都是用B+树实现的,那么为什么选择了B+树作为其实现呢? 参考资料:sql优化(面试必问一) 这个是有实际证据的,如MySQL中,采用B+树成功限制了,树高,参见: ...原创 2019-11-01 17:54:44 · 266 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 06 查询优化器的工作
一 优化器在MySQL架构中的位置: 二 先看逻辑上的作用 一言以蔽之:找到最好的执行计划。 三 静态优化和动态优化 这个和一般的编译器优化的区别差不多,静态优化即语法上的转换,替换常量等等,动态优化则要考虑实时的运行状态,选择最优的执行路线。 四 优化器常见的工作 简单的表达式中进行常量的等价替换: MIN MAX COUNT: 外连接转化为内连接: ...原创 2019-11-01 12:40:50 · 172 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 05 查询当前C/S连接(线程)所处的状态
注意,这里的MySQL连接,其实可以看作就是一个客户端(mysql -u root -p 登录就相当于建立了一个客户端到服务端的连接)。 关于上面说的show full processlist命令,这里可以试一下效果: ...原创 2019-11-01 10:59:57 · 174 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 04 半双工的C/S通信方式
划重点: 1)MySQL的C/S是半双工的,即双方都能够发送接收,但是信道在一个时间点只能发送/接收。 2)客户端一次只能发送一个数据包进行查询,长度由max_allowed_packet限制;但是服务端一次能发送多个数据包给客户端,并且客户端最好要一直接收完毕,这就是为什么建议使用LIMIT。 3)客户端从服务端接收数据像是“从消防水管喝水”,被动且无奈。 ...原创 2019-10-31 23:14:03 · 204 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 02 利用索引
索引的知识太多,学问太深,《高性能MySQL》专门拿出一整章叙述这个问题(第五章),从索引的原理(B+树),InnoDB的数据存储方式(聚簇索引),到如何建立好的索引 —— 避免冗余索引,在选择性比较好的列上建立索引,建立组合索引从而形成覆盖索引,索引的最左匹配原则等等。 这里就不再展开,后面将有专题专门介绍。 ...原创 2019-10-31 23:00:42 · 145 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 03 重构sql查询方式
重构sql查询方式 一 一个复杂的关联查询 VS 多个简单查询 如果这个复杂查询的所需要的扫描的行数本来就很小,换言之,直接使用复杂查询MySQL很容易完成,则不必多说,直接用一个复杂的即可。这里之所以讨论是否分解为多个简单查询,就是因为在复杂查询涉及的表大,扫描行多时,看能否进行性能上的优化。 先看一个例子: 单个复杂查询: 多个简单查询: 当然,这里注意,从第二行开始的每...原创 2019-10-31 22:55:28 · 143 阅读 · 0 评论 -
高性能MySQL(3th)(知识补丁) —— 一条sql的执行过程
《高性能MySQL》第三版 P.204: 这里说一下,查询缓存的作用: 要点: ① 要比对SQL语句是不是一模一样,这个比对可以通过类似于hashmap.get(sql)来实现的(联想Java中的HashMap<String,String>),如果存在则直接拿到结果,如果没有则说明没有该sql查询的记录。 ② 如果命中,不能直接返回结果,要检查一下用户权限。...原创 2019-10-31 22:52:51 · 160 阅读 · 0 评论 -
高性能MySQL(3th)(第六章 sql优化) —— 01 减少冗余数据
一 查询冗余的条数 如实际前台只需要TOP10,但是查询时使用 LIMIT 100。 解决方案:使用需要的大小限制。e.g. LIMIT 10,或者至多LIMIT 20。 二 查询冗余的的列 避免使用 “ select * “ 这种不加选择的select语句,或者“ select col1,col2 “而实际上只使用col1的情况。这会带来多余的I/O,数据传输,内存,CPU的消耗...原创 2019-10-31 22:17:41 · 325 阅读 · 0 评论 -
高性能MySQL(3th)(知识补丁) —— 为什么要设置主键自增
① 保证始终在B+树右侧insert 自增ID可以保证每次插入时B+索引是从右边扩展的,可以避免B+树和频繁合并和分裂(对比使用UUID)。如果使用字符串主键和随机主键,会使得数据随机插入,效率比较差。 在右侧就算分裂也只是右边缘分裂,左侧不会影响。 ② 自增同时保证了唯一性 如果只是unique,则id唯一性需要应用程序来保证(unique只能“检查”给定的id是否重复),而self-i...原创 2019-10-31 18:23:48 · 223 阅读 · 0 评论 -
高性能MySQL(3th)(第一章 MySQL概述) —— 04 InnoDB和MyISAM
一 InnoDB和MyISAM存储方式 聚簇 VS 非聚簇 InnoDB采用聚簇索引的方式存储数据,即主键索引(若没有设置unique索引则InnoDB会默认给主键创建索引)和数据一起存储,或者说,表中的数据是在内存中是按照主键索引的递增顺序组织存储的。对于InnoDB,一条sql如果筛选条件利用了主键索引,则InnoDB会直接查询数据文件,在叶子节点即可拿到数据。 而MyISAM则采用了非......原创 2019-10-31 18:52:49 · 236 阅读 · 0 评论 -
高性能MySQL(3th)(第一章 MySQL概述 ) —— 02 MySQL隔离级别
一 数据库隔离级别标准 抛开MySQL,一般性的数据库隔离级别有4种: 而不同的隔离级别可以避免的并发不一致问题也是不一样的: 关于三种问题的描述,可以详见: 并发一致性问题 这里谈谈自己对不同隔离级别为什么会产生相应的并发一致性问题的理解: 1)未提交读产生脏读 这里其实最好理解,未提交读可以认为未实现事务的“隔离性”,导致其他事务可以“看见”本事务的数据,就如并发一...原创 2019-10-31 16:47:23 · 174 阅读 · 0 评论 -
高性能MySQL(3th)(第一章 MySQL概述) —— 03 MySQL默认事务提交
一 MySQL默认采用自动提交(autocommit) 注意,MySQL的innodb引擎支持事务,MyISAM不支持。对于innodb而言,每一条“sql+分号”+回车后,就相当于封装了一个事务,即以下的第一种方式实质上就是第二种方式: 第一种: 第二种: 一言以蔽之 —— Innodb的每一条sql都默认是自动提交的事务。 则就有了这样的推论:采用Innodb引擎的默认情...原创 2019-10-31 16:50:01 · 227 阅读 · 0 评论 -
高性能MySQL(3th)(第一章 MySQL概述) —— 01 MySQL逻辑架构
MySQL逻辑架构 可以分为三层:客户端,服务层,存储引擎层。 书中写到: 注意,第一个行的“最上层的服务“指的不是客户端,而是图中的“连接/线程处理”,实际上,MySQL 和Redis一样,是C/S架构的,客户端只是服务调用者,所有服务都由服务端提供。而我们敲的sql语句(默认自动事务提交)或者事务在敲回车之前,都只是还未发送的客户端请求而已。 而对于上图中服务器层和存储引擎层各...原创 2019-10-31 13:25:21 · 230 阅读 · 0 评论