数据库
文章平均质量分 68
数据库
Elephant_King
github:https://github.com/Elephant-King9
平时写的代码会上传到github,欢迎学习交流
展开
-
【数据库】SQL优化
使用缓存优化查询进行多次相同的查询,结果就会放入到缓存中,后续再进行相同的的查询,就直接从缓存中提取,不会到表中提取数据explain检测SQL语句(SQL执行计划)给搜索字段建立索引where后面的字段建立索引但是查询大量数据还是会全表搜索,索引失效,具体原因是MySQL会对查询进行优化,除了主键索引以外其他的都是辅助索引,会二次回表查找,速度更慢,所以自动优化为全表查询(聚簇索引与非聚簇索引)如果已经知道查询的数据有m条了,可以通过limit m来限制这样数据在查询时查到第m条数据就会自动.原创 2022-02-25 20:37:59 · 328 阅读 · 0 评论 -
【数据库】binlog和redolog的一致性问题
对于解决MySQL中binlog和InnoDB的redolog日志同步的问题,MySQL采用了内部XA(两阶段提交)MySQL的内部XA流程prepare阶段:第一阶段,事物管理器向所有涉及到的数据库服务器发出prepare“准备提交”请求,数据库收到请求后执行数据修改和日志纪律等处理,处理完成后只是把事务状态改成可以提交,然后把结果返回给事务管理器commit阶段:事物管理器收到回应后进入第二阶段,如果在第一阶段内有任何一个数据库的操作发生错误,或者事物管理器收不到某个额数据库的回应, 则认原创 2022-02-23 15:59:17 · 368 阅读 · 0 评论 -
【数据库】什么情况会导致索引失效
列与列对比某个表中,两个列a,b都建立了单独索引,下面这种查询条件不会走索引select * from test where a = b这种情况被认为还不如走全表扫描存在NULL值条件当只针对一个字段的关于NULL的判断,如果通知再两个字段对NULL进行判断,还是会走全表扫描比如select * from table where name is null假如name有索引,则是走的索引如果再加一个idselect * from table where name is null or原创 2022-02-22 16:17:39 · 360 阅读 · 0 评论 -
【数据库】覆盖索引的最左前缀原则
覆盖索引对于概念可以举一个例子假设一条语句执行的是select ID form Twhere k between 3 and 5假设k是索引,因为Innodb的的辅助索引是只存主键值(ID)的,如果查询别的数据,就需要根据k索引树找到对应数据的ID值,然后再根据ID值去主键索引中查找具体要查找的数据,这个过程也叫做回表但是我们这里只是要查询ID,在辅助索引上就可以直接获得,而不用进行回表,这种“覆盖了”我们查询需求,我们称之为覆盖索引最左前缀原则最左匹配原则是非常重要的原则mysql会原创 2022-02-22 15:22:55 · 562 阅读 · 0 评论 -
【数据库】InnoDB和MyISAM的区别以及适用场景
区别 1.是否支持事务 InnoDB支持事务,对于每条SQL语句都会默认封装为事务,为了提高速度可以把多条SQL放在begin和commit之间,形成一个事务 MyISAM不支持事务 2.是否支持外键 InnoDB支持 MyISAM不支持 3.索引类型 InnoDB为聚簇索引 ...原创 2022-01-28 20:49:14 · 1095 阅读 · 0 评论 -
【数据库】mysql主从同步原理
目录概念好处流程主节点 binary log dump 线程 从节点IO线程 从节点SQL线程注意主从同步模式异步复制全同步复制半同步复制概念MySQL主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点建立一个和主数据库(参照物)完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。好处1.可以对数据进行热备份,作为后辈数据库,祝数...原创 2022-01-28 20:24:31 · 787 阅读 · 0 评论 -
【数据库】binlog和redo log的区别
1.redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用2.redo log是物理日志,记录的是“在XXX页上做了XXX修改”;binlog是逻辑日志,记录的是“给id=2这一行的c字段+1”3.redo log是循环写的(类似于循环队列),固定空间会用完;binlog是可以追加写入的,追加写是指binlog文件写到一定大小会切换到下一个,并不会覆盖以前的日志4.redo在事务执行过程中会不断的写入,具体可以看这篇文章中的事务简化流程;而b原创 2022-01-28 19:41:54 · 853 阅读 · 0 评论 -
【数据库】MVCC(多版本并发控制)
学习之前,需要先了解事务的四种隔离级别概念 多版本并发控制读取数据时通过一种类似快照的方式将数据保存下来,这样读写就不冲突了,MVCC使得普通的select请求不会加锁,提高了数据的并发处理能力,也是乐观锁的一种体现 优点读写不冲突,提高并发能力适用范围 只适用于rc(读已提交)和rr(可重复读)级别实现原理 In...原创 2022-01-28 19:24:53 · 810 阅读 · 0 评论 -
【数据库】ACID依赖什么保证
了解这一点之前,需要先了解这个两个概念InnoDB事务日志MVCC原理原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql一致性由其他三大特性保证,程序代码要保持业务上的逻辑性比如如果插入相同主键的记录,数据库会报错,但是比如银行中有90块但是你要取100块,就应该在程序代码中保证程序不能继续运行隔离性 由MVCC(多版本并发控制)实现持久性 由内存...原创 2022-01-28 19:26:15 · 458 阅读 · 0 评论 -
【数据库】InnoDB事务日志
事务日志分类undo log主要用于记录数据完成增删改操作之前的事务redo log 主要用于记录数据完成增删改操作之后的事务Undo+Redo事务的简化过程假设有A、B两个数据,值分别为1,2,开始一个事务,事务的操作内容为:把1修改为3,2修改为4,那么实际的记录如下(简化):1.事务开始2.记录A=1到undo log 3.修改A=3 4.记录A3到redo log ...原创 2022-01-28 18:22:59 · 869 阅读 · 0 评论 -
【数据库】事务的四种隔离级别
学习之前要先了解,什么叫脏读、幻读和不可重复读读未提交(read uncommit)(ru)也就是说在一个事务还没有提交的时候,别的事务有可能读到这个未提交事务的数据比如事务1 将A的存款从700改成1000,事务1还没有提交的时候事务2读取到了事务1提交的1000,但是事务1发生了错误进行回滚,导致A的存款还是700,但是事务2认为A的存款是1000,就产生了脏读读已提交(read commit)(rc)也就是说一个事务提交以后才有可能被其他事物读到 ...原创 2022-01-26 22:25:05 · 675 阅读 · 0 评论 -
【数据库】事务的基本特性
ACID原子性(Atomic)指的是一个事务中的操作要么都成功,要么都失败比如A一个事务是A给B转账,那么这个事务分为两步,第一步是A转出,第二步是B收到转账,那么这两步操作要么都成功,要么都失败,也就是说只要A转出了,B就必须收到,如果B没有收到,那么A不能转出一致性(Consistency)指事务不需从一个一致性状态转换到另一个一致性状态,通俗的说就是一个事务执行前后都必须是一致性状态假设A和B总共600块,那么不管彼此之间有多少转账事务,...原创 2022-01-26 21:44:57 · 293 阅读 · 0 评论 -
【数据库】mysql执行计划
mysql执行计划就是解释当mysql执行查询语句的时候是如何在数据库中执行的、相关表是如何连接的、连接次序、有哪些索引和索引的具体使用情况、每个表的扫描数据量等等可以通过这些数据来分析selelct语句的执行情况,从而对select语句进行优化执行计划参数与解释我们可以看到参数有id,select_type,table,partition,type,possible_keys,key,key_len,ref,rows,filtered,Extra参数1.id 表示SQ...原创 2022-01-26 20:30:08 · 534 阅读 · 0 评论 -
【数据库】锁
目录锁的分类颗粒度层面全局锁表锁加锁范围:特点:优点:缺点:适用场景:使用的存储引擎:行锁加锁范围:特点:优点:缺点:适用场景:使用的存储引擎:页锁加锁范围:特点:缺点:使用的存储引擎:锁级别层面共享锁(读锁)(S锁)排他锁(写锁)(X锁)意向共享锁(IS)和意向排他锁(IX) 注意: 作用:InnoDB的锁Record LockGap Lock ...原创 2022-01-26 17:14:20 · 323 阅读 · 0 评论 -
【数据库】脏读、幻读、不可重复读
脏读是指当前一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库,这时,另外一个事务也访问这个数据,然后使用了这个数据例如:张三的工资为5000,事务A把他的工资改为8000,但事务A还没有提交同时,事务B正在读取张三的工资,读取到张三的工资为8000随后,事务A发生一场,发生了事务回滚,张三的工资又回滚成了5000 最后,事务B读取到的张三的工资为8000,8000就是一个脏数据,...原创 2022-01-26 16:57:49 · 469 阅读 · 0 评论 -
【数据库】索引设计原则
索引一定要建立在查询更快、占用空间更小的基础上建立适合1.适合索引的列是出现在where子句中的列,或者连接字句中的唯一列比较好理解,如果建立的索引并不会经常被使用到,建立索引就只会增加空间,没有意义了2.对于数据量较小的表,索引效果差,没有必要建立索引如果一个表中只有几十条数据,从头到位遍历一遍速度也很快,建立索引就没有意义了3.使用短索引,如果对长字符串进行索引,应该制定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过索引前缀长度,则使用...原创 2022-01-26 15:04:52 · 965 阅读 · 0 评论 -
【数据库】聚簇索引与非聚簇索引
两者都是使用B+树的数据结构,可以看一下这篇文章聚簇索引将数据和索引放在一起,并且是按照一定顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻的存放在磁盘上的一般情况下主键就是默认的聚簇索引用图来解释就是这样的上图就是按照主键建立的聚簇索引,叶子结点存储着该主键所有的信息因为B+树是指在叶子结点存放数据,聚簇索引就是直接将行的所有数据存储在叶子结点上InnoDB引擎就使用聚簇索引非聚簇索引.原创 2022-01-26 14:39:40 · 1206 阅读 · 0 评论 -
【数据库】mysql索引底层数据结构原理(为什么采用B+树而不采用链表、BST、AVL)
这里我们首先要介绍一下磁盘IO的概念磁盘IO数据的索引是存储在磁盘中的,当需要调用索引来查找数据的时候,我们需要将磁盘中的索引加载到内存中,然后供CPU进行操作,在内存中对数据的处理速度是远高于磁盘IO的速度的,所以速度损耗一般发生在磁盘的IO速度上磁盘IO就是磁盘的输入输出,将磁盘内容加载到内存与将内存中的内容放入磁盘mysql索引的数据结构,各自优劣索引的数据结构和具体的存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引...原创 2022-01-25 17:12:19 · 856 阅读 · 0 评论 -
【数据库】索引的基本原理
索引用来快速的寻找那些具有特定值的记录,如果没有索引,一般来说执行查询语句时要便利一整张表索引原理就是把无序的数据变成有序地查询1.创建了索引的列的内容进行排序2.对排序结果生成倒排表(对于hash来说倒排表里面的数据是hashcode?) 3.在倒排表内容上拼上数据地址链(类似于对hash中的数据中保存实际地址的索引) 4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到数据参考文章膜拜!华为大牛透...原创 2022-01-23 21:51:59 · 776 阅读 · 0 评论