SQL--知识及原理
文章平均质量分 84
sql
向着百万年薪努力的小赵
当注意力专注于一件事上,岁月就会显得十分轻浮,快的有些过于浪荡——远近书疏,莫不手答,笔翰如流,未尝壅滞
展开
-
MySQL死锁详解及检测和避免
上一篇博客我们知道的Mysql事务的隔离机制和实现,以及锁的详细解析链接: 详解MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现,还有锁的详解在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。这个问题我们需要从几个方面来分析,一个是锁为什么不释放,第二个是被阻塞了怎么办,第三个死锁是怎么发生的,怎么避免。如果一个事务一直未释放锁,其他事务会被原创 2022-07-01 18:01:11 · 4837 阅读 · 0 评论 -
详解MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现,还有锁的详解
用一个图来讲解,在并发环境下,多个事务操作同一对象带来的问题:概念:一个事务在一个时间段内 前后读取的数据不一致,或者出现了修改/删除。概念:事务A 按照查询条件读取某个范围的记录,其他事务又在该范围内出入了满足条件的新记录,当事务A再次读取数据到时候我们发现多了满足记录的条数(幻行)前提:两者都是读取到已经提交的数据不可重复读:重点是在于修改,在一个事务中,同样的条件,第一次读取的数据与第二次【数据不一样】(因.....................原创 2022-06-30 16:09:21 · 4708 阅读 · 0 评论 -
MySQL的事务概念
我们规定了,做一件事情,只有成功和失败!用个很经典的例子举例:,A向B转账十万,能不能发生一遍付钱一边没收钱的情况?现实中一定是A和B同时成功或者失败,不能出现一边成功另一边失败的情景,这就是事务的简单例子。那么由这个例子我们想想事务其实是为了保证什么?假如:所以**事务其实就是想要做的事情是一个整体!**事务的存在目的就是为了事情能够正确成功的执行。如果以数据库的角度去看:在关系型数据库中,事务其实就是【一组原子性的SQL】或者说一个独立不可分割的工作单元,如果数据库引擎能成功的对数据库引用该组原创 2022-06-30 15:03:54 · 4704 阅读 · 1 评论 -
掌握Explain分析性能瓶颈、避免索引失效
有个面试题分享给大家:创建了组合索引 ( A , B , C) 查询条件where C =1 AND A =1 AND B >1,是否用到索引呢?怎么证明?有关索引介绍及详解,可以参考我的一篇博客:链接: MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)当我们执行查询语句时,在前面加上EXPLAIN便可以查看本次执行的相关信息里面的字段都有哪些值,分别是都是啥意思呢?这个其实是 表名 或者显示的别名const:使用了主键索引,通常只会匹配一行,这种性能是非常高的。原创 2022-06-29 19:56:10 · 2615 阅读 · 0 评论 -
MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)
索引在关系型数据库中,是一种单独的、物理的对数据库表中的一列或者多列值进行排序的一种存储结构,它是某个表中一列或者若干列值的集合,还有指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录,可以根据目录重点页码快速找到所需要的内容,数据库使用索引以找到特定值,然后顺着指针找到包含该值的行,这样可以是对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。在InnoDB里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的非空的唯一索引)、全文索引。一句话总结:索引能原创 2022-06-29 13:08:59 · 4881 阅读 · 1 评论 -
MySQL 的回表、覆盖索引、索引下推
在研究mysql二级索引的时候,发现Mysql回表这个操作,往下研究了一下字面意思,找到索引,回到表中找数据解释一下就是:举个例子说明:假如和两个字段是个联合索引,我们通过=18这个索引找到了二级索引树对应页所在的数据,但是由于是模糊查询,导致了这个字段的索引失效,我们得到了二级索引的这一页中=18的很多个数据(主键id),我们通过这些主键ID回到主键索引树里再查表里的数据,这个操作就是回表。另外回表的产生也是需要一定条件的,如果一次索引查询就能获得所有的select 记录(也就是联合索引已经包含了你查原创 2022-06-28 22:59:33 · 3455 阅读 · 2 评论 -
MySQL三大日志——binlog、redoLog、undoLog详解
我们都知道,事务的四大特性里面有一个是持久性,具体来说就是只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态。那么mysql是如何保证一致性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题,主要体现在两个方面:1)、 因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!2)、 一个事务可能涉及修改多个数据页,并原创 2022-06-25 15:54:38 · 53241 阅读 · 115 评论 -
MySQL常见配置参数及命令
:客户端连接自动断开连接时间(默认值是28800s,8个小时),自动断开的操作是“Server层的连接器做的”,断开后需要重新连接;:初始化连接资源(MySQL 5.7及之后):控制redo log刷盘时机,建议设置为1,每次提交事务redo log都会直接持久化到磁盘:控制binlog的刷盘时机,建议设置为1:是否自动提交,默认为自动提交:控制每个语句执行的最长时间,避免单个语句执行太长时间:开启全局锁,锁对象是整个数据库实例,数据库处于只读状态,对应使用来解锁:慢查询日志阈值:脏页比例上限,默认值原创 2022-06-25 10:25:53 · 773 阅读 · 0 评论 -
MySql——InnoDB引擎总体架构
总图: Buffer Pool主要分为3个部分:Buffer Pool、Change Buffer、Adaptive HashIndex,另外还有一个(redo) log buffer。Buffer Pool缓存的是页面信息,包括数据页、索引页。Buffer Pool默认大小是128M (134217728字节),可以调整。査看Buffer Pool系统变量:查看Buffer Pool服务器状态,里面有很多跟Buffer Pool相关的信息:如果内存的缓冲池写满了怎么办?(Redis设置的内存原创 2022-06-23 12:14:49 · 674 阅读 · 0 评论 -
MySQL的刷脏机制
先了解下前置知识:首先,对于InnoDB存储引擎来说,数据都是放在磁盘上的,存储引擎要操作数据,必须先把磁盘里面的数据加载到内存里面才可以操作。 这里就有个问题,是不是我们需要的数据多大,我们就一次从磁盘加载多少数据到内存呢?比如我要读6个字节。 磁盘I/O的读写相对于内存的操作来说是很慢的。如果我们需要的数据分散在磁盘的不同的地方,那就意味着会产生很多次的I/O操作。 所以,无论是操作系统也好,还是存储引擎也好,都有一个预读取的概念。也就是说,当磁盘上的一块数据被读取的时候,很有可能它附近的位原创 2022-06-21 10:43:33 · 1145 阅读 · 0 评论 -
一条更新sql的完整执行流程(超详细)
查询流程,我们是不是再研究下更新流程、插入流程和删除流程?一条查询sql的完整执行流程(从连接到引擎,穿插涉及到的知识,超详细)在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate。的方法, 没有 doDelete()和 dolnsert()。更新流程和查询流程有什么不同呢?取到数据前和查询的基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于原创 2022-06-21 10:33:22 · 959 阅读 · 2 评论 -
一条查询sql的完整执行流程(从连接到引擎,穿插涉及到的知识,超详细)
一条sql的完整执行流程原创 2022-06-20 10:29:15 · 1703 阅读 · 0 评论 -
各种join的用法图解
只写了join等同于 inner join原创 2021-12-14 11:33:46 · 228 阅读 · 0 评论 -
Oracle内置的connect、resource和dba三个标准角色说明
授权语句:-- Grant/Revoke role privileges --给用户授予权限grant connect to 用户名; --赋予用户创建连接的权限grant dba to 用户名; --赋予用户数据库管理员的权限grant resource to 用户名; --赋予用户创建实体的权限--语句后面可以加 with admin option,意思是该用户可以将这个权限再授予别的用户Oracle原创 2021-11-10 15:06:16 · 2069 阅读 · 0 评论 -
Oracle索引的建立及优缺点
在看公司建表语句时发现了这样一段代码本着学习的态度面向百度:::::原来这是Oracle的索引数据库索引是为了提高查询速度的一种数据结构。索引的创建语句。CREATE INDEX 索引名 ON 表名(列名);除了单列索引,还可以创建包含多个列的复合索引。CREATE INDEX 索引名 ON 表名(列名1, 列名2, 列名3, ...);删除索引。DROP INDEX 索引名;查看某个表中的所有索引。SELECT * FROM ALL_INDEXES WHERE原创 2021-09-29 10:19:13 · 1802 阅读 · 0 评论