![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql
文章平均质量分 59
之前使用过PostgreSQL的数据库,但是好像大部分的公司使用的 都是mysql或者是oracle,所以特地来学习一下,希望能有所收获
結城
人道洛阳花似锦,偏我来时不遇春
展开
-
一文读懂分布式数据库
的数据,N 取决于数据被打散到多少台服务器上。该存储层迅速切换从服务器就行了。这样,就算有数据服务器寄了,也只会影响。原创 2024-01-25 10:59:16 · 375 阅读 · 0 评论 -
mysql高可用设计,主库挂了怎么办
以上的方法都需要完成一个叫VIP(Virtual IP)的东西,即用户访问的ip是可以随意绑定在任何一台服务器上的。因为要让用户直接用起来,当有挂了的主机时,用户刷新一下,你底层直接把这个VIP绑给其他主机就可以返回给用户结果了。首先来说对于无状态服务的高可用设计是比较简单的,发现有不能用的就直接停了换别的服务器就行,比如Nginx。这里说一下无状态服务就是不需要记录你的状态、数据等等,各个服务器提供的是一样的服务。mysql分库分表不同服务器能提供的查询服务是不一样的,因为存的东西不一样。原创 2024-01-25 09:47:02 · 701 阅读 · 0 评论 -
分布式锁的实现方式
分布式锁是指分布式环境下,系统部署在多个机器中,实现多进程分布式互斥的一种锁。实现分布式锁有三种主流方式,接下来一一盘点。原创 2024-01-24 20:08:18 · 468 阅读 · 0 评论 -
海量并发场景下,如何实现分布式事务
首先得知道,正常一个事务要满足ACID原则,但是实际上,海量并发环境下是分库分表的,需要协调多个系统才能完成一个事务。那么怎么设计策略来保证事务的ACID中的呢?接下来介绍主要的两种思想。原创 2024-01-24 19:36:53 · 974 阅读 · 0 评论 -
分库分表后如何解决唯一主键问题?雪花算法、自增id详解
在单库单表时,业务 ID 可以依赖数据库的自增主键实现,现在我们把存储拆分到了多处,如果还是用数据库的自增主键,势必会导致主键重复。但要是利用加锁来处理,又会严重拖垮效率。实际开发中主要有三种方式。原创 2024-01-16 10:15:55 · 886 阅读 · 0 评论 -
如何结合主从复制,不停服情况下解决分库分表
首先我们要知道和两个概念,在此基础上可以将问题分为几个阶段来执行,参考了。原创 2024-01-15 22:45:55 · 403 阅读 · 0 评论 -
MySQL解决海量数据和并发性的方案——分库分表
分库分表其实是两个事情,为了解决的东西实际上也是两个,但是。原创 2024-01-15 22:27:12 · 651 阅读 · 4 评论 -
读写分离的手段——主从复制,解决读流量大大高于写流量的问题
假设说有这么一种业务场景,读流量显著高于写流量,你要怎么优化呢。因为写是要加锁的,可能就会阻塞你读请求。而且其实读多写少的场景还很多见,比如电商平台,用户浏览n多个商品才会买一个。大部分人的思路可能是建个缓存来帮助 MySQL 抗住大部分的查询请求。但是这不行,因为应用缓存的原则之一是保证缓存命中率足够高,不然很多请求会穿透缓存,最终打到数据库上。不同用户的请求基本上都不一样。所以你要考虑优化数据库来抗住高查询请求,首先要做的就是区分读写流量区,这样才方便针对读流量做单独扩展,这个过程就是流量的“原创 2024-01-14 23:01:25 · 673 阅读 · 1 评论 -
慢sql的解决思路
需要发散下思维,往架构方向思考。原创 2024-01-10 16:28:58 · 456 阅读 · 0 评论 -
mysql查询优化策略
其实很多人都搞不清什么时候用exist什么时候用in,前提是有索引(比如A.cc和B.cc),选择的标准是看表的大小。,具体来说:可能有点懵逼,让我们来捋下两者实现逻辑。IN是内部B先查完,然后整体结果扔给外部A再匹配;EXIST是A出一条,然后B用来判断EXIST是true还是false,直到A的所有数据都被遍历。那自然小的数据集驱动大的数据集比较好(也就是先出数据的是小数据集)原创 2024-01-10 15:06:55 · 516 阅读 · 1 评论 -
索引下推(ICP)的应用条件
对于InnoDB表,ICP 仅用于二级索引。ICP 的目标是减少全行读取次数,从而减少I/O操作。如果表访问的类型为range、ref、 eq_ref和ref_or_null可以使用索引下推。ICP可以用于InnoDB和MyISAM表,包括分区表InnoDB和MyISAM 表。当SQL使用覆盖索引时,不支持ICP.因为这种情况下使用ICP不会减少I/O。相关子查询的条件不能使用ICP。原创 2024-01-09 23:03:20 · 467 阅读 · 0 评论 -
sql优化,内外连接有什么区别
举例来说,首先是外连接(左外连接为例),当两个表都没有索引,就都是全表扫描。对被驱动表(book)加上索引,就可以避免其被全表扫描了,然后再在驱动表(type)加索引,发现没用。然后加索引在book,ok结果稀疏平常。原创 2023-12-28 18:29:25 · 396 阅读 · 1 评论 -
mysql索引调优性能的常见手段
常见的手段,当该字段的值比较长的时候,存整体的话,B+树索引的节点内存不下几个,那么每个节点包含的记录数太少,会导致树太高,索引的效果会大打折扣,而且索引还会浪费更多的空间。但这个方式也要注意,找到合适的前缀长度,使其能较好地区分数据。原创 2023-12-27 15:24:10 · 383 阅读 · 0 评论 -
如何查看mysql语句执行成本,EXPLAIN FORMAT=JSON
explain format=json 可以打印详细的执行计划成本。原创 2023-12-24 15:46:32 · 102 阅读 · 0 评论 -
mysql的性能调优,explain的用法,explain各字段的解释
EXPLAIN一条语句的各字段解析如下。原创 2023-12-24 15:26:48 · 58 阅读 · 0 评论 -
事务的两阶段提交
参考了小林coding事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。举个例子,假设 id = 1 这行数据的字段 name 的值原本是 ‘jay’,然后执行 UPDATE t_user SET name = ‘xiaolin’ WHERE id = 1; 如果在持久化 redo log 和 binlog 两个日志的过程中,出现了半成功状态,那么就有两种情况:可以看到,在持久化 redo log 和 binl原创 2023-12-20 16:23:24 · 69 阅读 · 0 评论 -
binlog和redolog到底有啥区别,数据恢复到底用哪个
binlog 是 MySQL 的 Server 层实现的日志,所有存储引擎都可以使用;redo log 是 Innodb 存储引擎实现的日志;原创 2023-12-20 11:24:41 · 545 阅读 · 0 评论 -
redolog有什么用,是怎么工作的
并且尽管redolog是磁盘的一块空间,但写入的过程是顺序的,因为它是一个循环的逻辑空间,如下图所示,需要注意实际上redo日志文件是若干文件组串起来的。一个mtr执行过程中可能产生若干条redo日志,这些redo日志是一个不可分割的组,所以其实并不是每生成一条redo日志,就将其插入到log buffer中,而是每个mtr运行过程中产生的日志先暂时存到一个地方,当该mtr结束的时候,将过程中产生的一组redo日志再全部复制到log buffer中。,其实这步保证了,其他的都好说了。原创 2023-12-18 21:38:18 · 124 阅读 · 0 评论 -
binlog日志,二进制日志的简介
在这种情况下,一个有效的解决办法是配置主从数据库服务器 ,甚至是一主多从的架构,把二进制日志文件的内容通过中继日志,同步到从数据库服务器中,这样就可以有效避免数据库故障导致的数据异常等问题。物理日志则是redolog的范畴了,记录内容是“在某个数据页上做了什么修改”,是数据页变更,因为数据最终是保存在数据页上的,属于 InnoDB 存储引擎层产生的。binlog的bin就暴露了他是二进制的文件,你用vi或者vim是没办法读的,得用专门的方式,比如mysqlbinlog工具。Q:binlog怎么刷盘的。原创 2023-12-18 16:00:22 · 42 阅读 · 0 评论 -
undo日志的理解
对比redo日志是持久性的保证,undo日志保障的是事物的原子性。事务在更新数据之前要先写一个undo_log事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半会出现一些情况,比如:●情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。●情况二:程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前事务的执行。原创 2023-12-15 16:33:40 · 92 阅读 · 0 评论 -
乐观锁与悲观锁
这样别人想来拿同样的数据就会被阻塞,直到悲观锁被释放,悲观锁中的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去锁的开销,加大了系统的整个吞吐量。数据库中的行锁,表锁,读锁(共享锁),写锁(排他锁),以及Java中的syncronized 实现的锁均为悲观锁。但如果经常产生冲突,上层应用会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。2、悲观锁依赖数据库锁,效率低。原创 2023-12-14 21:27:00 · 137 阅读 · 0 评论 -
读懂死锁日志
LOCK WAIT 表示事务正在等待锁,11 lock struct(s) 表示该事务的锁链表的长度为 11,每个链表节点代表该事务持有的一个锁结构,包括表锁,记录锁以及 autoinc 锁等。RECORD LOCKS 表示记录锁(并且可以看出要加锁的索引为 order_id_un),space id 为 300,page no 为 5480,n bits 552 表示这个记录锁结构上留有 552 个 bit 位(该 page 上的记录数 + 64)。以下是四种锁类型的表示,需要注意的是。原创 2023-12-14 19:35:54 · 47 阅读 · 0 评论 -
MySQL常见死锁的发生场景以及如何解决
所以其实破坏任意一个都能避免死锁,MySQL常用的是设置事务等待锁的超时时间和开启主动死锁检测。前者设置一个事务等待超过时间阈值就自动回滚(这样锁就释放了另一个事务就可以继续了)。后者则是主动检测发现死锁后会回滚死锁中的一个事务。原创 2023-12-08 20:20:56 · 215 阅读 · 1 评论 -
MySQL中是如何insert数据的
正常insert数据,MySQL并不会显式加锁,而是通过聚簇索引的trx_id索引作为隐式锁来保护记录的。比如两个事务对一个非唯一的索引情况添加,会造成幻读但在某些特殊情况下,原创 2023-12-08 20:17:02 · 230 阅读 · 0 评论 -
mysql的行锁具体是怎么工作的
加锁的对象是索引,加锁的基本单位是 next-key lock。在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁。mysql行级锁是怎么工作的?这个比较复杂,请移步。原创 2023-12-05 14:34:55 · 164 阅读 · 0 评论 -
mysql中MDL(元数据锁)的长事务读写阻塞如何解决
那其存在的长事务读写阻塞问题,一般是怎么解决的呢,主要有两种解决方法。原创 2023-12-05 11:14:56 · 193 阅读 · 0 评论 -
mysql有哪些锁,理解各种表锁和行锁
主要用于数据库的备份,但会使得备份期间不能有任何事务插入删除更新数据,这很影响实际业务。所以通常不用这个全局锁来完成数据库的备份。假设数据库的存储引擎支持可重复读,那么常见的方法是通过MVCC来实现的,也就是备份事务开始时候创建一个read view,然后根据这个read view来备份,这样不影响其他事务的更新。原创 2023-12-04 18:57:36 · 171 阅读 · 5 评论 -
MVCC是如何保证隔离性的
那具体MVCC是咋工作的呢?需要介绍两个机制:read view和聚簇索引的两个隐藏列。原创 2023-12-01 11:07:57 · 256 阅读 · 2 评论 -
可重复读为什么能避免一部分幻读,但是没能完全避免幻读
我们会发现,A事务其实没主动插入id=5的数据,是B事务插入并且提交的,A数据想要执行update就不能用快照,得用当前数据的版本,所以就把B的数据读出来了,然后就给更新了。所以MVCC是不能完全避免幻读的。虽然可重复读不能完全避免幻读,但其实已经避免了很大一部分了。但是为啥说这俩机制没完全解决幻读呢?主要是以下两种情况没法避免。MySQL innoDB引擎的默认隔离级别——可重复读。已经介绍过了,接下来我们谈谈细节部分。原创 2023-11-29 16:26:31 · 188 阅读 · 0 评论 -
事务的状态和ACID特性
事务就是。原创 2023-11-28 14:40:10 · 91 阅读 · 1 评论 -
如何优化索引?
ALL是全表扫描,就是啥索引也不用。index是对索引表进行全扫描,这样做的好处是不再需要对数据进行排序,但是开销依然很大。—以上是效果不咋样的,下面开始就是能发挥出索引优势的级别了—range是用到范围了一般是where中有> < in between了,能利用上索引。ref 类型表示采用了非唯一索引,或者是唯一索引的非唯一性前缀,返回数据返回可能是多条。因为虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。原创 2023-11-28 10:13:27 · 267 阅读 · 0 评论 -
最左匹配原则的误区,联合索引的使用细节
在a > 1 and b = 2这一部分确实用不到,但是a = 1 and b = 2是可以的,因为对于符合 a = 1 的二级索引记录的范围里,b 字段的值是「有序」的。Q2: select * from t_table where a >= 1 and b = 2,联合索引(a, b)哪一个字段用到了联合索引的 B+Tree?Q1: select * from t_table where a > 1 and b = 2,联合索引(a, b)哪一个字段用到了联合索引的 B+Tree?原创 2023-11-28 09:38:50 · 160 阅读 · 0 评论 -
MySQL存储引擎如何优化索引搜索的
就是查询字段在索引的B+树的叶子节点里。原创 2023-11-27 20:13:37 · 79 阅读 · 0 评论 -
建立索引要注意的情况
可以很大程度提升连表查询性能。原创 2023-11-27 16:13:25 · 52 阅读 · 3 评论 -
索引出错问题。为什么建立了索引,也避免了索引失效问题,还是会出现查询不走索引的情况?
什么建立了索引,也避免了索引失效问题,还是会出现查询不走索引的情况?其实这个问题在于CBO(Cost-based Optimizer),优化器是很强大的!他根据开销来决定是否要用索引以及用哪个索引!总的来说Cost = Server_Cost + Engine_Cost,也就是CPU开销和io开销那具体哪些情况会导致有索引也不走呢?原创 2023-11-27 10:24:47 · 58 阅读 · 1 评论 -
会导致索引失效的几种情况
这一点非常有趣!当MySQL涉及到字符串和int类型比较适合,会先把字符串转换为数字,而不是数字转换为字符串。转载 2023-11-27 09:33:06 · 33 阅读 · 0 评论 -
怎么建好联合索引,联合索引的建立思路
这寄了,因为or会让索引失效,所以尽量别这么做,把它拆成两个索引然后union就可以了!假设有or咋整,比如where a > 1 and b = 2 or c = 3。,这个其实也是可以正常走索引的,就理解成几个特殊的=合并就行了。例如 where a > 1 and b = 2 and c < 3。一定要遵循最左匹配原则!原创 2023-11-26 15:35:38 · 125 阅读 · 5 评论 -
聊一聊索引覆盖的好处
答:若查询的字段在二级索引的叶子节点中,则可直接返回结果,无需回表。这种通过组合索引避免回表的优化技术也称为索引覆盖(Covering Index)。在叶子节点中的包括索引字段和主键值。大致想一想就知道,假设查询到的记录100条,每查到一条记录就要做一次回表,去用聚簇索引找主键对应的记录,那就得回表100次!所以用好二级索引和索引覆盖将大幅降低查询时间开销。问:索引覆盖啥意思?原创 2023-11-26 15:07:01 · 163 阅读 · 0 评论 -
唯一索引和普通索引的使用上要注意什么
你可能会将id_card作为主键了,但最好别这么做。你想想这么长一串的做主键,查询时候效率其实是比较低的,其实是建议选择其他的作为主键。那么我们很可能查的时候还是要按照身份证查的啊!所以在身份证上做个索引是应该的。那么用唯一索引还是普通索引?其实这里业务逻辑已经保证了身份证号唯一,所以唯一索引和普通索引在逻辑上都是对的。那么到底挑哪个呢?原创 2023-11-23 16:36:47 · 46 阅读 · 0 评论 -
innoDB的缓冲池(Buffer Pool)的工作原理
数据存在磁盘了,总不能次次和磁盘交互吧,所以innoDB有一个缓冲池(Buffer Pool),有了缓冲池后,读写就优先在缓冲池了。读先在缓冲池读,没有再去磁盘加载进缓冲池;写也是先写缓冲池,然后等后台线程去刷写磁盘。线程池默认128M,也可以自己设置。我们知道数据基本读写单位是页,在缓冲区里也一样,也是按照页来分配的,叫缓存页(包括数据页、索引页、undo页等)。原创 2023-11-22 20:35:02 · 135 阅读 · 0 评论