Mysql 存储引擎
概述在文件系统中,Mysql 将每个数据库(也可以称为 schema)保存为数据目录下的一个子目录。创建表示,Mysql 会在数据库子目录下创建一个和表同名的 .frm 文件保存表的定义。因为 Mysql 使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体平台密切相关。Windows 中大小写不敏感;类 Unix 中大小写敏感。不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在 Mysql 服务层统一处理的。 MySQL 的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的 MySQL 还允许开发人员设置自己的存储引擎。 存储引擎相关操作查看存储引擎命令123456789101112# 查看支持的存储引擎SHOW ENGINES;# 查看默认的存储引擎SHOW VARIABLES LIKE 'storage_engine';# 查看某表所使用的存储引擎SHOW CREATE TABLE `table_name`;# 查看某数据库中的某表所使用的存储引擎SHOW TABLE STATUS LIKE ...
Mysql 架构
概述总的来说,MySQL 可以大体分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、解析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。 Mysql 查询流程SQL 语句在 MySQL 中是如何执行的? 大概流程可以参考下图: flowchart TD A[“客户端连接”] --> B[“连接器<br>管理连接, 认证”] B --> C{“查询缓存<br>(仅MySQL < 8.0)”} C -- 缓存命中 --> D[直接返回结果] C -- 缓存未命中/无缓存 --> E[“解析器<br&...
扩展 SQL
表查看表的基本信息12SELECT * FROM information_schema.tablesWHERE table_schema = 'test' AND table_name = 'user'; 查看表的列信息12SELECT * FROM information_schema.columnsWHERE table_schema = 'test' AND table_name = 'user'; 修改表的编码格式utf8mb4 编码是 utf8 编码的超集,兼容 utf8,并且能存储 4 字节的表情字符。如果表的编码指定为 utf8,在保存 emoji 字段时会报错。 1ALTER TABLE <tableName> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 其他显示哪些线程正在运行12345678mysql> show processlist;+----+---------------...
SQL 语法速成
SQL 简介 🔔 本文只针对mysql 数据库术语数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。行(row) - 表中的一条记录。列(column) - 表中的一个字段。所有表都是由一个或多个列组成的。主键(primary key) - 一列(或一组列),其值能够唯一标识表中每一行。 SQL 语法 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。 SQL 语法结构SQL 语法结构包括: 子句 - 是语句和查询的组成成分,如:select、from、where、group by等。 表达式 - 表达式是能计算得出一个值的代码片段,如:>...
数据库系统概论
基础与模型类术语数据信息的符号表示,是数据库存储的基本对象。它本身没有特定的含义,是对客观事物属性的抽象表示。eg:28是一个数据,但是如果知道它代表年龄,那它就被赋予了语境和含义,成为了信息。 数据库数据库是长期存储在计算机内、有组织的、可共享的、统一管理的数据集合。它不仅仅是一堆数据的堆积,而是以某种数据模型组织起来,可以被多个用户和应用共享。 数据库的关键点如下: 长期存储:与内存中的临时数据不同,数据库数据是持久化的。 有组织:数据按照特定的结构(如表格)存放,而不是杂乱无章。 可共享:多个用户或应用程序可以同时访问和使用数据库。 数据库管理系统数据库管理系统(Database Management System, DBMS)是一个位于用户(或应用程序)与操作系统之间的系统软件。它的核心任务是科学地组织和存储数据,并高效地获取和维护数据。 数据库管理系统的核心功能包括:包括数据定义、数据操作、数据存储与管理、数据库的建立与维护等。 eg: MySQL, Oracle是关系型 DBMS 的代表;MongoDB, Redis 是非关系型 DBMS 的代表。 数据库系统是...
redis 面试题
缓存缓存穿透查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库,这就是缓存穿透。 解决方案一缓存空数据;查询返回的数据为空,仍把这个空结果进行缓存 优点:简单 缺点:消耗内存,可能发生不一致的问题 解放方案二布隆过滤器,经典加一层,去redis查找之前,先来它这里确认一遍。它可以用于检索一个元素是否在一个集合中,先生成一个BitMap数组,里面全是0。存储数据时,根据hash值计算数组索引,将其对应的值改为1。 查找数据的时候,使用相同hash函数获取hash值,判断对应位置是否为1。 优点:节约空间,没有多余的key 缺点:实现复杂,存在误判的概率,bitMap数组越大,误判越小。 缓存击穿给某一个key设置了过期时间,当kev过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一互斥锁,在线程一redis缓存过期时,获取锁,查询DB,重建缓存。此时其他线程无法获取锁,无法进行后续select操作。 优点:强一致性 缺点:性能较差 解决方案二逻辑过期 优点:性能好 缺点:一...
jvm类加载
类加载机制 类是在运行期间动态加载的。 类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,并转为可执行的代码的过程。 类的生命周期 Java 类的完整生命周期包括图片中这几个阶段: 加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始。而解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 类加载过程是指加载、验证、准备、解析和初始化这 5 个阶段。 (一)加载加载流程: 通过类的全限定名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的java.lang.Class对象 加载来源: 本地文件系统: .class文件 网络下载: Applet 压缩包: JAR、WAR文件 运行时计算生成: 动态代理 其他文件生成: JSP (二)验证验证是链接阶段的第一步。验证的目标是确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 验证阶段大致会完成 4 个阶段的检验动作: 文...
redis高级数据类型
BitMapBitmap,即位图,是一串连续的二进制数组(0 和 1),可以通过偏移量(offset)定位元素。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。 参考 https://dunwu.github.io/
jvm字节码
字节码Java 字节码是Java虚拟机执行的一种指令格式。之所以被称之为字节码,是因为:Java 字节码文件(.class)是一种以 8 位字节为基础单位的二进制流文件,各个数据项严格按照顺序紧凑地排列在 .class 文件中,中间没有添加任何分隔符。整个 .class 文件本质上就是一张表。 Java 能做到 “一次编译,到处运行”,一是因为 JVM 针对各种操作系统、平台都进行了定制;二是因为无论在什么平台,都可以编译生成固定格式的Java 字节码文件(.class)。 字节码文件结构一个简单的 HelloWorld.java 1234567package cn.itcast.jvm.t5; // HelloWorld 示例public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } } 执行 javac -parameters -d . HellowWorld.jav...
jvm垃圾回收
如何判断对象可以回收引用计数法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。 两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。 12345678910public class ReferenceCountingGC { public Object instance = null; public static void main(String[] args) { ReferenceCountingGC objectA = new ReferenceCountingGC(); ReferenceCountingGC objectB = new ReferenceCountingGC(); objectA.instance = objectB; objectB.instance = objectA; }} 因为循环引用的存在,所以 Java 虚拟机不适用引用计数算法。 ...