MySQL高级
文章平均质量分 91
MySQL进阶原理分析学习记录
Anton丶
前路不尽,心已明,行将远......
展开
-
MySQL高级第十七篇:数据库主从复制原理及保证数据一致性
在实际工作中,我们常常将Redis作为缓存与MySQL来配合使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出,如果不存在再访问数据库。这样就提升了读取的效率,也减少了对后端数据库的访问压力。此外,对于一般数据库应用而言,都是读多写少的,当数据库读取数据压力较大时,我们可以从成本较小的方案开始优化,可以首先考虑优化SQL和索引,其次就是缓存策略,最后才是主从架构。原创 2023-04-24 23:01:29 · 2177 阅读 · 0 评论 -
MySQL高级第十六篇:数据库日志有哪些(慢查询日志、通用查询日志、错误日志和二进制日志)
慢查询日志:记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。通用查询日志:记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令,对我们复原操作的实际场景、发现问题,甚至是对数据库操作的审计都有很大的帮助。错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的状态,从而对服务器进行维护。二进制日志:记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。原创 2023-04-23 22:35:05 · 1389 阅读 · 0 评论 -
MySQL高级第十五篇:MVCC多版本并发控制原理剖析
MVCC(Multiversion Concurrency Control)多版本并发控制。就是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换句话说,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。本篇介绍了MVCC在READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行快照读操作时访问记录的版本链的过程。原创 2023-04-22 15:02:17 · 793 阅读 · 0 评论 -
MySQL高级第十四篇:锁机制分类详解(表锁,行锁,页锁,悲观锁和乐观锁)
事务的隔离性就是由锁来实现。锁是计算机协调多个进程或线程并发访问某一资源的机制。和在开发中加锁以保证数据的一致性一样,这个思想在数据库领域中同样很重要。在数据库中,数据是一种供许多用户共享的资源,为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。原创 2023-04-20 22:00:52 · 824 阅读 · 0 评论 -
MySQL高级第十三篇:MySQL事物日志(redo日志-undo日志执行流程)
事务有4种特性:原子性、一致性、隔离性和持久性。事务的隔离性由锁机制实现,而事务的 原子性、一致性和持久性 由事务的 redo日志 和 undo日志 来保证。REDO LOG : 重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG : 回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。REDO 和 UNDO 都可以视为是一种恢复操作,区别如下:redo log:是存储引擎层(innodb)生成的日志,记录的是物理级别。原创 2023-04-12 23:00:55 · 1041 阅读 · 0 评论 -
MySQL高级第十二篇:数据库事物概述和隔离级别
事物:一组逻辑操作单元,使数据从一种状态变成另一种状态,这一组逻辑操作要么全部成功,要么全部放弃。ACID是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的。原创 2023-04-11 21:29:55 · 592 阅读 · 0 评论 -
MySQL高级第十一篇:数据库调优策略(定位-调优-结构)
另外,表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。尤其在数据量大,而且需要频繁进行连接的时候,为了提升效率,我们也可以考虑增加冗余字段来减少连接。通过建立中间表,把需要经常联合查询的数据插入中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。对于需要经常联合查询的表,可以建立中间表以提高查询效率。索引相关问题前边几章节已经详细剖析过,这里不在赘述。Redis支持持久化。原创 2023-04-09 21:58:21 · 668 阅读 · 0 评论 -
MySQL高级第十篇:数据库设计三范式与表设计原则
有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务优先的原则,首先满足业务需求,再尽量减少冗余。如果数据库中的数据量比较大,系统的UV和PV访问频次比较高,则完全按照MySQL的三大范式设计数据表,读数据时会产生大量的关联查询,在一定程度上会影响数据库的读性能。如果我们想对查询效率进行优化,反范式优化也是一种优化思路。此时,可以通过在数据表中增加冗余字段来提高数据库的读性能。原创 2023-03-30 21:29:46 · 1077 阅读 · 0 评论 -
MySQL高级第九篇:覆盖索引和索引条件下推等相关策略
索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据,当能通过读取索引就可以得到想要的数据时,那就不需要读取行了。一个索引包含了满足查询结果的数据就叫做覆盖索引。非聚簇复合索引的一种形式,它包括在查询里的SELECT、JOIN和WHERE子句用到的所有列(即建索引的字段正好是覆盖查询条件中所涉及的字段)。简单说就是,索引列+主键包含SELECT到FROM之间查询的列。原创 2023-03-28 10:11:18 · 1299 阅读 · 0 评论 -
MySQL高级第八篇:关联查询、子查询和排序相关优化
子查询是MySQL的一项重要的功能,可以帮助我们通过一个SQL语句实现比较复杂的查询。但是,子查询的执行效率不高。,即一个SELECT查询的结果作为另一个SELECT语句的条件。,其速度比子查询要快,如果查询中使用索引的话,性能就会更好。在MySQL中,可以使用连接(JOIN)查询来替代子查询。使用子查询可以进行SELECT语句的。大大增加了1O的次数。原创 2023-03-27 08:47:48 · 1620 阅读 · 0 评论 -
MySQL高级第七篇:什么情况下会导致索引失效?
MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。如果查询时没有使用索引,查询语句就会扫描表中的所有记录,在数据量大的情况下,这样查询的速度会很慢。大多数情况下都(默认)采用B+树来构建索引。其实用不用索引,最终都是优化器说了算。优化器是基于什么的优化器?基于cost开销。原创 2023-03-26 14:58:14 · 689 阅读 · 0 评论 -
MySQL高级第六篇:数据库性能分析与优化
1.观察服务器状态,看是否存在周期性波动,是的话可以尝试加缓存或者调整缓存失效策略;2.否则考虑开启慢查询日志,找出比较慢的SQL语句;3.分析SQL语句:EXPLAIN,SHOW PROFILE4.如果是因为SQL等待时间比较长,考虑调整服务器参数;5.如果是因为SQL执行时间比较长,考虑优化索引、SQL语句本身或者表设计;6.如果以上都不能解决,考虑是否SQL查询达到瓶颈7.这时需要考虑读写分离,分库分表等。定位了查询慢的SQL之后,就可以。原创 2023-03-25 18:13:43 · 741 阅读 · 0 评论 -
MySQL高级第五篇:索引的创建与设计原则
1.唯一性约束的字段2.频繁使用where查询的字段3.经常GROUP BY 和 ORDER BY 的列4.UPDATE,DELETE 时的 where 条件列5.DISTINCT的字段6.多表JOIN连接时创建索引注意连接表的数量尽量不超过3张,每加一张表就相当于嵌套一次循环对 where 条件创建所以用于连接的字段创建索引7.尽量给数据类型小的列添加索引,节省空间,让一页存在更多记录,比较速度页更快8.使用区分度高的列作为索引。原创 2023-03-19 16:38:19 · 641 阅读 · 0 评论 -
MySQL高级第四篇:InnoDB存储结构之页、区、段和表空间
我们都知道,索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中,并且索引是在存储引擎中实现的,存储引擎负责对表中数据的读取和写入工作。原创 2023-03-16 23:53:59 · 1626 阅读 · 0 评论 -
MySQL高级第三篇:Hash索引,AVL树,B树和B+树对比
Hash本事是一个函数,可以帮助我们大大提高检索效率,因为它。非叶子节点仅用于索引。B+树查询效率更稳定。B+树的查询效率更高。原创 2023-03-14 23:10:22 · 585 阅读 · 0 评论 -
MySQL高级第二篇:索引的分类及MyISAM与InnoDB中的索引对比
这个很简单,每个页只存储一条的话,完全没有什么效果,连树的结构都不能形成。针对主键构建的索引,聚簇即数据行和相邻的键值存储在一起。聚簇索引并不是一种单独的索引类型,而是一种。,即所有的用户记录都存储在了叶子结点,可以有多个非聚簇索引。同时为多个列建立索引。原创 2023-03-13 23:03:08 · 367 阅读 · 0 评论 -
MySQL高级第一篇:索引的来源,优缺点及B+树的演化
当记录一个页放不下时,会存放在多个页中,以双向链表连接,但无论几个页,主键ID都要保持递增,如果插入顺序不是按递增主键插入,会发生记录移动,以保持这种结构,多个页中的这种行为称为页分裂。当多个页查询时,我们难以定位到数据在哪一个页,只能从第一页开始遍历,基于这种情况,考虑可以给所有的页建立一个目录项,让目录项连续依次递增,每个目录项记录页的最小记录和页号。1,随着页的越来越多,目录项也越来越多,而目录项存储在连续的空间,页越来越多,空间压力也越来越大;2,数据页的增删使得目录项也需要增删,很不方便。原创 2023-03-12 17:50:58 · 930 阅读 · 0 评论