![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 61
FuzhouJiang
专注后端、C/C++开发的菜鸟,相信日拱一卒、功不唐捐。欢迎各位对博文批评指正,互相学习
展开
-
MySQL分库分表
上,而不是一个服务器上。按垂直分库后,如果还是放在一个数据库服务器上, 随着用户量增大,这会让单个数据库的处理能力成为瓶颈,还有单个服务器的磁盘空间,内存,tps等非常吃紧。数据库业务层面的拆分,和服务的“治理”,“降级”机制类似,也能对不同业务的数据分别的进行管理,维护,监控,扩展等。数据库往往最容易成为应用系统的瓶颈,而数据库本身属于“有状态”的,相对于Web和应用服务器来讲,是比较难实现“横向扩展”的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。原创 2023-06-16 22:55:33 · 479 阅读 · 1 评论 -
MySQL读写分离
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。目前较为常见的MySQL读写分离方式有:程序代码内部实现Mycat我们这里也就是实验通过Mycat代理进行数据库读写,实现读写分离在不同的服务其上。原创 2023-06-16 22:39:38 · 628 阅读 · 0 评论 -
MySQL主从复制
主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程和slave的二个线程)1、主库的更新操作写入binlog二进制日志中。2、master服务器创建一个binlog转储线程(线程1),将二进制日志内容发送到从服务器。3、slave机器执行命令会在从服务器创建一个IO线程(线程2),接收master的binary log复制到其中继日志首先slave开始一个工作线程(I/O线程),I/O线程在master。原创 2023-06-16 22:25:31 · 582 阅读 · 0 评论 -
SQL详细处理流程.md
连接器:管理连接,权限验证解析器:词法以及语法分析优化器:生成执行计划,选择合适索引执行器:操作引擎获取结果存储引擎:存储数据,提供读写接口原创 2023-06-16 22:11:49 · 203 阅读 · 0 评论 -
mysqldump 数据备份
将 mytest库的 user 表 导出到 ~/user.sql 中。利用上面的导出的user.sql 文件恢复。OPTION通常是:-u 用户名 -p。原创 2023-06-16 22:04:16 · 203 阅读 · 0 评论 -
binlog数据恢复实践
刷新和重新打开日志,表明用当前点之前的数据恢复。此时再查看mysql数据库发现数据恢复。mysql数据恢复通过:数据。找到创建库的时间点是775。然后找到删库时间是1409。原创 2023-06-16 21:48:06 · 80 阅读 · 0 评论 -
MySQL日志系统
前面提到的redo log和undo log称为事务日志;MySQL发起请求的流程如下错误日志查询日志:记录所有sql二进制日志:用于数据恢复主从复制,记录了DDL、DML语句除select外慢查询日志。原创 2023-06-16 21:42:48 · 43 阅读 · 0 评论 -
MySQL优化问题
就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)查询缓存适用更新不频繁的表,因为当表更新频繁的话,查询缓存也总是被清空,过多的查询缓存的数据添加和删除,就会影响MySQL的执行效率,还不如每次都从磁盘上查来得快(缓存指的就是一块内存,内存I/O比磁盘I/O快很多)。原创 2023-06-16 21:33:27 · 1718 阅读 · 0 评论 -
MySQL redo log
重做日志,用于记录事务操作的变化,确保事务的持久性。redo log是在事务开始后(begin;之后)就开始记录,不管事务是否提交都会记录下来,在异常发生时(如数据持久化过程中掉电),InnoDB会使用redo log恢复到掉电前的时刻,保证数据的完整性。undo log 称为逻辑日志, redo log称为物理日志;原创 2023-06-16 21:17:52 · 939 阅读 · 1 评论 -
MySQL死锁
MyISAM表锁是的, 这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在 InnoDB 中发生死锁是可能的。如下是一个典型的死锁场景死锁一般由自己应用造成的,和多线程编程死锁情况类似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序。原创 2023-06-15 20:07:10 · 475 阅读 · 1 评论 -
MySQL死锁
MyISAM表锁是的, 这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在 InnoDB 中发生死锁是可能的。如下是一个典型的死锁场景[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kiy6YkGF-1686830636618)(MySQL死锁.assets/image-20230615195909941.png)]原创 2023-06-15 20:06:14 · 433 阅读 · 0 评论 -
意向共享锁和意向排他锁
数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间等待和锁冲突;):事务计划给记录加行排他锁,事务在给一行记录加排他锁前,必须先取得该表的IX 锁。):事务计划给记录加行共享锁,事务在给一行记录加共享锁前,必须先取得该表的IS 锁。本身自带提交事务,释放线程占用的所有表锁。2)事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。(S或X锁)被占用,只需要快速检查IX和IS锁即可;原创 2023-06-15 19:56:41 · 609 阅读 · 0 评论 -
MVCC和undo log
没有解决幻读是因为每次select都会产生一次新的数据快照,其他事务增加了新的记录行并且已成功提交,导致当前事务以同样条件查询时,出现记录数的改变了。理论实现隔离级别的方式,用于实现已提交读和可重复读隔离级别的实现,也经常称为多版本数据库。提供了两个读取操作:锁定读 和 非锁定读,MVCC提供了一个快照读,依赖于底层的undo log 即回滚日志。MVCC:每一行记录实际上有多个版本,每个版本的记录除了数据本身之外,增加了其它字段。,可实时反馈到当前事务的select中,所以解决了脏读问题。原创 2023-06-15 19:51:12 · 934 阅读 · 0 评论 -
MySQL间隙锁
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dq0qPGlu-1686828962949)(MySQL间隙锁.assets/image-20230615193034936.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9sGwD22-1686828962950)(MySQL间隙锁.assets/image-20230615193134270.png)]此时会话1想要插入数据要获取排他锁(X锁)会阻塞。),以及前后间隙加上间隙锁(原创 2023-06-15 19:36:51 · 870 阅读 · 0 评论 -
MySQL事务相关笔记
一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。事务有如下特性:1.事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。2.事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。原创 2023-06-15 14:46:06 · 4634 阅读 · 0 评论 -
排它锁和共享锁.md
排它锁Exclusive),又称为X 锁,写锁。共享锁Shared),又称为S 锁,读锁。X和S锁之间有以下的关系: SS可以兼容的,XS、SX、XX之间是互斥的显式加锁:select … lock in share mode 强制获取共享锁,select … for update 获取排它锁。原创 2023-06-15 11:42:34 · 287 阅读 · 0 评论 -
表级锁和行级锁
为什么有事务隔离性?因为要并发执行,数据安全性和一致性和并发效率问题串行化:锁实现,没有并发性用的多的是可重复读(mysql)和已提交读(oracle),因为权衡了数据安全性和一致性以及并发效率,采用MVCC多版本并发控制机制实现表级锁:对整张表加锁。开销小,加锁快,不会出现死锁;锁粒度大,发生锁冲突的概率高,并发度低。行级锁:对某行记录加锁。开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。InnoDB支持行级锁,MyISAM只支持表级锁。原创 2023-06-15 11:27:32 · 446 阅读 · 0 评论 -
索引常见问题
可以看到慢查询日志存放在 /var/lib/mysql/ubuntu-slow.log。然后切换超级用户查看 /var/lib/mysql/ubuntu-slow.log文件。思考流程:找到哪些运行时间长浪费性能的sql,然后再用explain分析。修改只针对当前会话,而慢查询日志开关是全局的。此时我们进行一次耗时的查询操作,都大于0.1s。打开另一个和mysql的会话,可以看到前面。3 查看慢查询日志,找出所有耗时日志;可以看到就是我们前面查询的三条记录。2 压测执行各种业务;1 设置慢查询日志;原创 2023-06-15 10:40:46 · 429 阅读 · 0 评论 -
MySQL哈希索引
建表时存储引擎选择MEMORY,则创建索引就是哈希索引:如create index nameidx on student(name);哈希索引底层数据结构就是链式哈希表,链式就是指冲突时用链表法解决哈希表中的元素没有任何顺序可言,则只能进行等值比较。如果做范围搜索,前缀搜索、orderby,则哈希表都不合适;没办法处理磁盘上的数据,加载到内存上构建高效的搜索数据结构,因为它无法减少磁盘IO次数;原创 2023-06-15 10:24:37 · 921 阅读 · 0 评论 -
聚集索引和非聚集索引
主键索引树和二级索引树没什么区别,都要通过数据地址寻址,存储引擎下,主键索引树的。的键和数据放在一起就称为。原创 2023-06-14 11:45:16 · 44 阅读 · 0 评论 -
B树和B+树索引
2000W数据构建AVL树,层数是25层(log2(2000W)),查找最多25次磁盘IO。二叉树是一个节点是数据域两个指针域。磁盘IO同理,我们读一部分数据会把一整块(16KB)的内容读下来,而不是需要多少读多少,一般会多读一些。如果用500阶B树则只需要3层,即查找最多需要3次IO。500叉树就是499个数据域,500个指针域。如 select * from student where uid=5;空间即8KB,剩下8KB-4B空间由。申请4B空间,实际系统可能给2个。原创 2023-06-14 11:42:28 · 1777 阅读 · 0 评论 -
索引介绍和基本使用
索引就是用来加速SQL查询的由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反。原创 2023-06-14 11:34:16 · 720 阅读 · 0 评论 -
MySQL存储引擎
一张表包含:表的结构数据索引存储引擎直接影响上面内容存储方式。原创 2023-06-14 11:20:39 · 717 阅读 · 0 评论 -
MySQL连接查询——外连接
可以看出先走 where 过滤b表数据,用b表先扫描(这和左外连接意图不一致),这样就转变为。由于a表记录数量少为小表做全表扫描(rows为6),然后到b表进行查询,用到了主键索引。了(小表做全表扫描),所以必须要将过滤条件加到 on 语句后。如果用not in,sql 语句如下。将左表做全表扫描,然后到右表匹配。将右表做全表扫描,然后到左表匹配。原创 2023-06-14 11:07:25 · 1159 阅读 · 0 评论 -
MySQL连接查询——内连接
(select id from t_user limit 1500000, 10) 得到的是小表,全表扫描,在 t_user 大表中查询做内连接(这里可用索引)多表连接查询时,一般第一张表的字段是最全的,可以和剩余表进行连接.这里又想查多个字段但是又希望效率不差,可以用如下方法。可以看出时间和查询一列差不多。不过这里和查询缓存也有关系。,然后去大表搜索,所以在。原创 2023-06-14 10:41:33 · 307 阅读 · 0 评论 -
MySQL常用操作(一)
select * from user where id>上一页最后一条数据的id值 limit 20;说明使用到了归并排序(外排序)可以性能优化,如加索引或者修改查询列。可以看出来age这一列没有建立索引,需要逐行查找。在没有索引的时候查找到指定的记录就停止,如果不加。这条语句能够利用id索引省去偏移的时间开销。,而方式2只要一次TCP握手和挥手。方式1五次insert就要5次的。工作中提前需要有大量记录的表。发现order by查询的。这个例子可以用于进行一些。注:or 也可用到索引。原创 2023-06-14 10:23:21 · 1466 阅读 · 0 评论 -
数据库表设计原则
第三范式已经很大程度上减少了数据冗余,并且基本预防了数据插入异常,更新异常,和删除异常了。(学号,课程名称)是联合主键,但是学分只和课程名有关,相当于只依赖于联合主键其中一个字段,不符合第二范式,应该修改为。示例:学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),学号是主键,但是。非主属性完全依赖于主关键字,如果不是完全依赖于主键,应该拆分为新实体,设计成一对多实体关系。,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。原创 2023-06-14 10:08:05 · 741 阅读 · 0 评论 -
MySQL数据类型和完整性约束
(4) 只是表示age显示的时候宽度为4, 但是占用的内存大小仍然是固定的。的值,但是枚举字段只能取一个唯一的值,而集合字段可以取任意个值。MySQL数据类型有:数值类型,字符串类型以及日期和时间类型。这两个类型,都是限制该字段只能取。:不可以为NULL,且不能重复。: 不能重复但可为NULL。原创 2023-06-14 10:04:38 · 56 阅读 · 0 评论 -
MySQL学习预备知识
MySQL目前属于Oracle,常见的关系型数据库还有SQL Server,Oracle、MySQL,MariaDB,DB2,大数据分布式数据库 Hbase,ceph(cc++实现的开源分布式db)非关系型数据库有:redis、leveldb、mongodb、rocksdbMySQL的服务器模型采用的是I/O复用+可伸缩的线程池,是实现网络服务器的经典模型,早期采用的多路复用模型是select,现在加入了epoll和kqueueubuntu下MySQL的配置文件在。原创 2023-06-14 10:00:41 · 40 阅读 · 0 评论 -
C++11实现数据库连接池
C++11实现数据库连接池原创 2023-03-23 11:33:53 · 457 阅读 · 0 评论 -
图床项目MySQL连接池代码阅读
图床项目MySQL连接池代码阅读原创 2023-01-04 13:44:39 · 175 阅读 · 0 评论 -
MySQL索引原理笔记
MySQL索引原理笔记原创 2022-11-15 20:03:43 · 488 阅读 · 0 评论 -
mysql连接池初识
数据库连接池初识原创 2022-11-01 10:51:09 · 312 阅读 · 0 评论 -
C语言实现往MySQL插入和读取图片
C语言实现往MYSQL插入和查询图片数据原创 2022-06-19 22:23:18 · 837 阅读 · 0 评论 -
C语言实现连接MySQL服务器CURD
C语言连接MySQL执行CURD原创 2022-06-19 13:40:11 · 286 阅读 · 0 评论 -
Workbench连接MySQL服务器报错
MySQL Workbench连接虚拟机上的mysql会失败(错误号:10061)注释掉这一行默认只允许本地回环地址连接,注释掉之后其它地址也可以连接到MySQL服务器了。之后再次尝试,又会报错:提示不允许root连接到MySQL服务器原因是:root只被允许在MySQL服务器所在机器登录:解决方法:创建一个用户并给予其能在远程主机连接MySQL服务器的权限:然后Workbench就可以连接进去了,但此时admin这个用户权限很低,要用root用户...原创 2022-06-19 11:01:39 · 2336 阅读 · 0 评论 -
使用FETCH语句获取游标数据最后一行重复
问题描述:《MySQL必知必会》中的P179存储过程执行完成之后在新表中重复插入了一行。小弟先谢谢各位大佬了。原创 2021-06-18 23:39:35 · 1285 阅读 · 1 评论