
MySQL
文章平均质量分 82
MySQL的学习
_索伦
结束,还是开始?
展开
-
MySQL:分库分表
刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也越来越多,我们做了数据库读写分离, 使用多个从库副本(Slave)负责读,使用主库(Master)负责写,master和slave通过主从复制实现数据同步更新,保持数据一致。slave 从库可以水平扩展,所以更多的读请求不成问题。但是当用户量级上升,写请求越来越多,怎么保证数据库的负载足够?增加一个Master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了,而且架构设计更加复。...原创 2022-08-12 12:42:29 · 389 阅读 · 0 评论 -
MySQL:读写分离原理和实践
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。原创 2022-08-11 21:03:16 · 618 阅读 · 3 评论 -
MySQL:MySQL的集群——主从复制的原理和配置
主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程和slave的二个线程)1、主库的更新操作写入binlog二进制日志中。2、master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。3、slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志。...原创 2022-08-10 18:32:46 · 629 阅读 · 0 评论 -
MySQL:日志系统介绍 | 错误日志 | 查询日志 | 二进制日志:bin-log数据恢复实践 | 慢日志查询
对于之前文章里提到的redo log和undo log是存储引擎的日志,而本章介绍的是MySQL Server的日志。原创 2022-08-09 19:42:55 · 246 阅读 · 0 评论 -
MySQL:你做过哪些MySQL的优化?
给大家讲过MySQL Server网络模块采用经典的I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)。...原创 2022-08-09 15:04:37 · 270 阅读 · 0 评论 -
MySQL:redo log日志——笔记自用
事务的ACD特性(原子性、一致性、持久性),都是依靠undo log和redo log日志保证的,redo log 并不是事务commit了才记录,而是begin开始后就记录。原创 2022-08-08 19:16:09 · 200 阅读 · 0 评论 -
MySQL:意向共享锁和意向排它锁 | 死锁 | 锁的优化
但在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在 InnoDB 中发生死锁是可能的。死锁问题一般都是我们自己的应用造成的,和多线程编程的死锁情况相似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序进行更新操作,以防止锁冲突导致死锁问题。4.不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。.原创 2022-08-08 18:39:18 · 357 阅读 · 0 评论 -
MySQL:已提交读和可重复读的实现原理 | MVCC(多版本并发控制)——笔记自用
从用户的角度来看,好象是数据库可以提供同一数据的多个版本(系统版本号和事务版本号)。undo log:回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是实现多版本并发控制(MVCC)下读操作的关键技术。:同一个事务开始的时候生成一个当前事务全局性的快照(Read View),第一次select查询时。图示:在该图中,第一个事务id是1000,它利用(DB_ROLL_PTR)保存了上一个事务操作的地址。,也经常称为多版本数据库。3、版本已提交,但是在快照创建前提交的,可以读取。.原创 2022-08-08 16:26:38 · 1210 阅读 · 0 评论 -
MySQL:锁机制 |表级锁、行级锁 | 排它锁、共享锁 | 间隙锁
InnoDB使用间隙锁的目的,为了防止幻读,以满足串行化隔离级别的要求,对于上面的例子,要是不使用间隙锁,如果其他事务插入了 userid 大于 100 的任何记录,那么本事务如果再次执行上述语句,就会发生幻读。3、即使SQL中使用了索引,但是经过MySQL的优化器后,如果认为全表扫描比使用索引效率更高,此时会放弃使用索引,因此也不会使用行锁,而是使用表锁,比如对一些很小的表,MySQL就不会去使用索引。2、由于InnoDB的行锁实现是针对索引字段添加的锁,不是针对行记录加的锁,因此虽然访问的是。...原创 2022-08-07 21:33:01 · 744 阅读 · 1 评论 -
MySQL:事务的概念 | ACID特性 | 事务并发存在的问题 | 事务处理命令
持久性的体现:例如在数据库读写操作时,先把数据写到cache缓存,再写到磁盘,那如果在缓存到磁盘这个过程中宕机了或断电了,数据会丢失,不过没关系,MySQL有redo log重做日志,undo log回滚日志,来保证数据库的永久性!有一个管理用户账户的表,如果要操作一个事务:从zhangsan账户里转50到liuchao账户里,简单来说需要两个sql语句,如果是InnoDB存储引擎,在执行中间发生了异常,可以回滚到最初的状态;保证事务执行的原子操作。是最高的事务级别,它防止读脏数据,不可重复读和虚读。...原创 2022-08-06 22:01:35 · 370 阅读 · 0 评论 -
MySQL:索引的底层实现 | 聚集索引和非聚集索引 | 自适应哈希索引
数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越“矮胖”,磁盘IO次数就少。原创 2022-08-06 17:30:49 · 344 阅读 · 0 评论 -
MySQL:索引的基础知识
当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要!......原创 2022-08-05 20:37:53 · 470 阅读 · 0 评论 -
MySQL:存储引擎
首先来回顾建表的过程,建表需要的内容有三个:表的结构、数据和索引。存储引擎直接影响这些内容的存储方式。原创 2022-08-05 17:48:42 · 115 阅读 · 0 评论 -
MySQL:连接查询 | 内连接,外连接
SELECT a.属性名列表, b.属性名列表 FROM table_name1 a RIGHT [OUTER] JOIN table_name2 b on。SELECT a.属性名列表, b.属性名列表 FROM table_name1 a LEFT [OUTER] JOIN table_name2 b on。若要查看所有学生的成绩信息:使用内连接,然后查看SQL的执行计划,发现先去扫描student表,因为该表数据少,所以当作小表。SELECT a.属性名1,a.属性名2,…......原创 2022-08-04 21:23:13 · 1001 阅读 · 0 评论 -
MySQL:order by排序查询,group by分组查询
实际上,limit, order by, group by这些查询,都是和索引有关系的,在该表中,主键是id,其他字段没有索引,那么对其他字段例如age操作时,可以看到最后一列显示,这给查询需要用到filesort即文件排序,涉及到磁盘的大量操作;而查询id用到的时 index,利用索引直接查询到。即按照字段进行升序或降序查询,默认是升序,可以根据 asc 和 desc后缀来指定。下面语句的意思是,若name相同时,年龄升序排序。按照name排序:会按照字典排序。...原创 2022-08-04 15:45:06 · 682 阅读 · 0 评论 -
MySQL核心SQL:结构化查询语句SQL、库操作、表操作、CRUD
数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update 和select 等。数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。有需要,可以学习数据库连接池,经过性能测试发现,省略大量TCP三次握手,提升的效率还是可以的。1.面试题:有自增键的表里,删除其中一条数据,再增加数据后,自增键是用以前删除的还是往后补?注意,这个insert是根据上面所建的表的字段进行的,为什么没写ID,因为ID是自增键。...原创 2022-08-03 15:55:22 · 1605 阅读 · 0 评论 -
MySQL:面试问的范式设计
例如:选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),(学号,课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖联合主键的其中一个字段,不符合第二范式。键,但是学院电话只依赖于所在学院,并不依赖于主键学号,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。示例:学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),学号是主。3)让数据组织的更加和谐。...原创 2022-08-03 10:00:54 · 1032 阅读 · 0 评论 -
MySQL:完整性约束和 表的设计原则
一对多关系:在订单子表里添加一列关联父表的主键(表示用户id的字段)。但以这样的方式,明显可以看出数据冗余,特别是成百上千的订单,会导致大批量的修改。如图,这是两张表,一个表示用户基本信息,一个表示身份信息,想让两张表产生关联,需要给身份信息表添加一个字段。一个表里只能创建一个主键,但可以有多个唯一键。为了解决数据冗余的问题,可以创建一个中间表。用户与订单:一对多关系。商品与订单:多对多关系。比如要做一个电商系统。用户和商品:没有关系。...原创 2022-08-03 09:10:36 · 191 阅读 · 0 评论 -
MySQL:数据类型和运算符
MySQL数据类型定义了数据的大小范围,因此使用时选择合适的类型,不仅会降低表占用的磁盘空间,间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。原创 2022-07-27 21:08:47 · 354 阅读 · 0 评论