数据库
文章平均质量分 92
dx1313113
这个作者很懒,什么都没留下…
展开
-
MySQL 三大日志(bin log、redo log、undo log)
而 bin log 属于逻辑日志,记录的内容是语句的原始逻辑,比如:“给id 为 2 的这一行的 a 字段 加 1”,属于 Server 层。数据页的大小是 16KB ,刷盘比较耗时,可能就修改了数据页中的 几 Byte 数据,为了这些数据而重新刷盘整个页,有所不值。硬盘上存储的 redo log 日志文件不止一个,而是以一个日志文件组的形式出现,每个 redo 日志文件大小是一样的。中数据时以页为单位,查询一条记录,会从硬盘中把该页的数据都加载出来,加载出来的页叫做数据页,会放入。原创 2023-10-20 20:52:07 · 571 阅读 · 1 评论 -
为什么MySQL使用B+树索引,而不使用其他作为索引呢?
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成一种排序号的数据结构。索引的作用相当于书的目录。打个比方:在查字典的时候,如果没有目录,那我们就只能一页一页地去查,速度很慢。如果有目录,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有:B树、B+树、Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam ,都使用了B+树作为索引结构。二分查找树。原创 2023-10-20 19:18:13 · 265 阅读 · 0 评论 -
为什么需要 Buffer Pool?
MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先从磁盘读取该数据,然后再内存中修改这条记录。那修改完这条记录是选择直接写回磁盘还是选择缓存起来呢?当然是缓存起来号,这样下次有查询语句命中这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。为此,Innodb 存储引擎设计了一个,来提高数据库的读写性能。原创 2023-10-10 09:40:25 · 75 阅读 · 0 评论 -
事务隔离级别是怎么实现的?
事务是在 MySQL 引擎实现的,我们常见的 InnoDB 引擎时支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性。当多个事务并发执行的时候,会引发脏读,不可重复读,幻读这些问题,那为了避免这些问题,SQL提出了四种隔离级别,分别是读未提交、读提交、可重复读、串行化、从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。要解决脏读现象,就需要将隔离级别升级到读提交以上的隔离级别,要解决不可重复读现象,就要将隔离级别升级到可重复读以上的隔离级别。原创 2023-09-14 10:43:44 · 136 阅读 · 0 评论 -
索引失效有哪些?
当使用 左 或者 左右 模糊匹配的时候,也就是 like %xx 或 like %xx% 这两种方式都会造成索引失效;当我们在查询条件中对索引列使用函数,就会导致索引失效。当我们在查询条件中对索引列进行表达式计算,也无法走索引MySQL在遇到字符串和数字比较的时候,会将字符串转换为数字,然后进行比较。如果字符串是索引列,而条件查询时数字,那么索引列会发生优势类型转换,由于隐式类型转换是通过 CAST 函数实现的,相当于对所有列使用了函数,所以就会导致索引失效。原创 2023-09-11 18:34:12 · 133 阅读 · 0 评论 -
count(*) 和 count(1) 有什么区别?哪个性能最好?
如果表里只有主键索引,没有二级索引时,那么,InnoDB 循环遍历聚簇索引,将读取到的记录返回给 server 层,然后读取记录中的 id 值,判断id值是否为 NULL,如果不为 NULL ,就将 count 变量加 1。前面的案例都是基于 InnoDB 存储引擎的,但是在 MyISAM 存储引擎里,执行 count 函数的方式是不一样的,通常在没有任何查询条件下的 count(*) ,MyISAM 的查询速度要明显快与 InnoDB。当我们在数据表中插入一条数据的同时,将计数表中的计数字段 + 1。原创 2023-09-11 09:46:02 · 623 阅读 · 0 评论 -
从数据页的角度看 B+Tree
InnoDB的数据是按照 [ 数据页 ] 为单位来读写的,默认数据页大小为 16KB。每个数据页之间通过双链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效的查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找的方式进行行检索,从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 B+Tree 作为索引,每个节点都是一个数据页。原创 2023-09-09 21:54:05 · 190 阅读 · 0 评论 -
MySQL 索引
索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象地说就是索引是数据的目录。所谓的存储引擎,就是如何存储数据、如何为数据建立索引和如何更新、查询数据等技术的实现方法。MySQL存储引擎有 MyISAM、InnoDB 、Memory ,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。%5Cinfty。原创 2023-09-06 15:16:53 · 324 阅读 · 0 评论 -
MySQL一行记录是如何存储的?
所以,在存储数据的时候,也要把数据占用的大小存起来,存到 [变长字段长度列表] 里面,读取数据的时候才能根据这个 [变长字段长度列表] 去读取对应长度的数据。B+ 树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘查询时就会有大量的随机I/O,随机 I/O 是非常慢的。varchar(n) 和 char(n) 的区别:char是定长的,varchar 是变长的,变长字段实际存储数据的长度(大小)不固定。原创 2023-08-29 20:48:50 · 931 阅读 · 0 评论 -
执行一条 select 语句,期间会发生什么?
执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将select *中的符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;原创 2023-08-26 23:15:32 · 101 阅读 · 0 评论