文章目录

  • 前言
  • 一、MySql数据库引擎
    • 1.1、数据库引擎任务
    • 1.2、常用的数据库引擎
    • 1.2.1、InnoDB存储引擎
        • 页主要部分
      • InnoDB的几个变量
    • 1.2.2、MyISAM存储引擎
    • 1.3 、存储引擎设置
    • 1.4、如何选择存储引擎
  • 二、索引的数据结构
    • 2.1、什么是索引
    • 2.2、索引有什么用
    • 2.3、优点和缺点
    • 2.4 为什么不使用hash 索引
    • 2.5 平衡二叉树
    • 2.6 B-Trees
    • 2.7 B+Trees
      • 2.7.1是单向列表还是双向列表?(mysql优化了B+trees 变成了双向链表)
    • 2.8、`索引失效`
    • 2.9、SQl语句调优(高薪)
    • 索引使用(重要)
  • 三、mvcc(多版本并发控制或者mcc)
    • 3.1、mvcc是什么
    • 当前读
    • 块照读
    • 快照读与mvcc的关系
    • 3.2、Inndb MVCC实现的核心知识点
  • 参考文章

前言

提示:这里可以添加本文要记录的大概内容:

把真实存取数据的功能化分为存储引擎功能 存储引擎就是指表的类型 ,以前也叫表处理器 现在叫存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。(5.7之前有查询缓存)


提示:以下是本篇文章正文内容,下面案例可供参考

一、MySql数据库引擎

SHOW ENGINES 查看数据库 引擎

MEMORY Hash based, stored in memory, useful for temporary tables 基于散列的,存储在内存中,对临时表很有用 YES
MRG_MYISAM Collection of identical MyISAM tables 相同MyISAM表的集合 YES
CSV CSV storage engine 存储引擎 YES
FEDERATED Federated MySQL storage engine :联合MySQL存储引擎 NO
PERFORMANCE_SCHEMA Performance Schema 性能模式 YES
MyISAM MyISAM storage engine MyISAM存储引擎 YES
InnoDB Supports transactions, row-level locking, and foreign keys 支持事务、行级锁定和外键 DEFAULT
BLACKHOLE /dev/null storage engine (anything you write to it disappears) 存储引擎(向它写入的任何内容都会消失) YES
ARCHIVE Archive storage engine 归档存储引擎 YES

SHOW VARIABLES LIKE ‘%storage_engine%’; 查询 默认 使用引擎

1.1、数据库引擎任务

在数据库引擎文档中,各主题的顺序遵循用于实现使用数据库引擎进行数据存储的系统的任务的主要顺序。

  • 设计并创建数据库以保存系统所需的关系或XML文档
  • 实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。
  • 为单位或客户部署实现的系统
  • 提供日常管理支持以优化数据库的性能

1.2、常用的数据库引擎

InnoDB,MyISAM,MEMORY,等

1.2.1、InnoDB存储引擎

官网地址
(5.5之后都用innoDB引擎了,之前用的都是 MyISAM)
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。InnoDB主要特性有:

1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合

2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的

3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上

4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

5、InnoDB被用在众多需要高性能的大型数据库站点上

硬盘存储结构
两个(没有专门保存数据的文件)

  • Frm文件:表的定义文件
  • Ibd文件:数据和索引存储文件。数据以主键进行聚集存储,吧真正的数据保存在叶子节点中。

页主要部分

  • Fil Header 文件头

  • Page Header 页眉

  • Infimum + Supremum Records
    “ Infimum ”和“ Supremum ”是指一个有序集合的外边界的数学术语。下确界是最大下界 (GLB),因此它低于可能的最低键值。上界是最小上界 (LUB),因此它大于可能的最大键值。
    InnoDB 首次创建索引时,会在根页面自动设置一条下确界记录和一条上确界记录,并且永远不会删除它们。它们为导航设置了一个有用的障碍,因此“ get-prev ”不会越过开头,“ get-next ”不会越过结尾。此外,infimum 记录可以是临时记录锁定的虚拟目标。
    InnoDB 代码注释区分“下确界和上确界记录”和“用户记录”(所有其他类型)。
    下确界和上确界记录可以被认为是索引页开销的一部分。最初,它们都存在于根页上,但随着索引的增长,下确界记录将存在于第一个或最低叶页上,而上确界记录将存在于最后一个或最大关键页上的最后一条记录。

  • User Records 用户记录
    在页面的用户记录部分,您将找到用户插入的所有记录。
    有两种方法可以浏览用户记录,具体取决于您是将他们的组织视为无序列表还是有序列表。
    无序列表通常称为“堆”。如果你说“无论我下一个碰巧捡到哪一个都会放在上面”来制作一堆石头——而不是根据大小和颜色来组织它们——那么你最终会得到一堆。同样,InnoDB不希望根据 B-tree 的键顺序插入新行(这将涉及大量数据的昂贵移动),因此它在现有行的末尾立即插入新行(在 Free 的顶部空间部分)或删除的行留下空间的任何地方。
    但是根据定义,B-tree 的记录必须可以按键值顺序访问,因此每个记录中都有一个记录指针(Extra Bytes 中的“下一个”字段),它指向键顺序中的下一个记录。换句话说,记录是一个单向链表(不是单向列表)。因此InnoDB可以在搜索时按键顺序访问行。

  • Free Space 可用空间

  • Page Directory 页面目录
    页面的页面目录部分具有可变数量的记录指针。有时记录指针被称为“槽”或“目录槽”。与其他 DBMS 不同, InnoDB页面中的每条记录都没有一个槽。相反,它保留了一个稀疏目录。在完整的页面中,每六条记录将有一个槽。
    槽跟踪记录的逻辑顺序(键顺序而不是堆上的放置顺序)。因此,如果记录是’A’‘B’‘F’‘D’,插槽将是(pointer to ‘A’) (pointer to ‘B’) (pointer to ‘D’) (pointer to ‘F’). 因为 slot 是 key order 的,并且每个 slot 都有固定的大小,所以很容易通过 slot 对页面上的记录进行二分查找。
    (由于 Page Directory 并不是每条记录都有一个 slot,所以二分查找只能给出一个粗略的位置,然后 InnoDB必须遵循“下一个”记录指针。InnoDB的“sparse slots”策略也考虑了 Extra Bytes 中的 n_owned 字段记录的一部分:n_owned 表示必须通过多少条记录,因为它们没有自己的插槽。)

  • Fil Trailer

InnoDB的几个变量

  1. innodb_buffer_pool_size

对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。

根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。

  1. innodb_flush_log_at_trx_commit

主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。

实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。

根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

  1. innodb_log_buffer_size
    log缓存大小,一般为1-8M,默认为1M,对于较大的事务,可以增大缓存大小。
    可设置为4M或8M。

  2. innodb_additional_mem_pool_size
    该参数指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。

根据MySQL手册,对于2G内存的机器,推荐值是20M,可适当增加。

  1. innodb_thread_concurrency=8
    推荐设置为 2*(NumCPUs+NumDisks),默认一般为8

1.2.2、MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。MyISAM主要特性有:

1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持

2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成

3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16

4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上

5、BLOB和TEXT列可以被索引
6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩

8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快

9、可以把数据文件和索引文件放在不同目录
10、每个字符列可以有不同的字符集
11、有VARCHAR的表可以固定或动态记录长度
12、VARCHAR和CHAR列可以多达64KB

硬盘存储结构
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型 :

  • frm文件存储表定义、
  • 数据文件的扩展名为.MYD(MYData)、
  • 索引文件的扩展名时.MYI(MYIndex)

硬盘存储结构

1.3 、存储引擎设置

修改 默认引擎

set default_storage_engine=MyISAM

-- 查询 数据库引擎
show Engines-- 查询默认 数据库引擎
SHOW VARIABLES LIKE '%storage_engine%';-- 创建 innoDB引擎数据库
create table emp1(id int ) engine =INNODB
-- 查询  大部分情况 都使用 INNODB 所有直接使用就行
SHOW create table emp1
-- 修改数据库引擎
alter table emp1 ENGINE=myisam;
-- 查看CREATE TABLE `emp1` (`id` int DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3
SHOW create table emp1

1.4、如何选择存储引擎

InnoDB支持外键
MyISAM不支持。
对一个包含外键的InnoDB表转为MYISAM会失败

  • 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM
  • 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
  • 系统崩溃后,MyISAM恢复起来更困难,能否接受;
  • MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

二、索引的数据结构

2.1、什么是索引

索引是一种数据结构 **在存储引擎中实现 根据存储引擎的不同 索引也不一定完全相同, 存储引擎可以定义每个表的最大索引数和最大长度, 所有引擎最少支持每个表至少16个索引 长度瑞 256 **

一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。

2.2、索引有什么用

提升查找速度 减少磁盘I/O的次数
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

2.3、优点和缺点

优点 : 速度快 数据唯一性 加速表和表之间的连接 减少查询中分组和排序数据 (就是提高速度)
缺点:创建和维护索引耗费时间数据越多,耗时也增加 ,占磁盘空间 降低更新表的速度 ,因为索引需要动态维护

2.4 为什么不使用hash 索引

很快
但hash值是无序的 ,不支持范围查找
当值 不同 hash值同的时候 会全表扫描浪费内存

2.5 平衡二叉树


回旋查找大小值的时候 非常麻烦

2.6 B-Trees

数据结构演示网站
也有回旋查找问题

Video_2022-03-18_084337

2.7 B+Trees

上面两部分 是 非叶子节点 只存储了 属性的key

下面是叶子节点 解决了回旋查找问题(通过双向链表,有序) 存储了key 还有value 值的地址
有的节点会同时是两种节点 ,这个节点的查询效率就大了一点()

B+Trees 默认就排序了 所有直接使用索引排序 不需要在重新排序了 提高效率

2.7.1是单向列表还是双向列表?(mysql优化了B+trees 变成了双向链表)


Mysql的innodb是以页为存储单位的,每个B+Tree的叶子节点都是一个页的大小的倍数,默认一页的大小是16K
也就是每一个页都包含两个页指针,一个是previous page指针,指向上一个页,一个是next page指针,指向下一个页。
头部还有Page的类型信息和用来唯一标识Page的编号。根据这个指针分布可以想象到Page链接起来就是一个双向链表。

2.8、索引失效

  • 如果在查询的时候, 使用了复合索引, 要遵循最左前缀法则, 也就是查询从索引的最左列开 始, 并且不能跳过索引中的列.
  • 尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进 行全表扫描
  • 应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全 表扫描。
  • 不做列运算where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函 数.计算表达式等, 都会是索引失效.
  • 查询 like,如果是 ‘%aaa’ 也会造成索引失效.
  • 应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有 索引,将导致引擎放弃使用索引而进行全表扫描
  • 注意防止回表

2.9、SQl语句调优(高薪)

  • 根据业务场景建立复合索引只查询业务需要的字段,如果这些字段被索引覆盖,将极 大的提高查询效率.
  • 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率.
  • where 条件字段上需要建立索引, 但 Where 条件上不要使用运算函数,以免索引失效
  • 排序字段上, 因为排序效率低, 添加索引能提高查询效率.
  • 优化 insert 语句: 批量列插入数据要比单个列插入数据效率高.
  • 优化 order by 语句: 在使用 order by 语句时, 不要使用 select *, select 后面要查有索引的列, 如果一条 sql 语句中对多个列进行排序, 在业务允许情况下, 尽量同时用升 序或同时用降序.
  • 优化 group by 语句: 在我们对某一个字段进行分组的时候, Mysql 默认就进行了排序, 但是排序并不是我们业务所需的, 额外的排序会降低效率. 所以在用的时候可以禁止 排序, 使用 order by null 禁用. select age, count(*) from emp group by age order by null
  • 尽量避免子查询, 可以将子查询优化为 join 多表连接查询.

索引使用(重要)

  • 索引的使用
-- all
select * FROM  a -- create unique index 索引名  on 表明(字段1,字段二)
create unique index nname on a(name,sbirthday)
-- 创建一个唯一索引-- index
explain select * FROM  a -- 查看当前的增删改查命令次数 来进行优化选择
show GLOBAL status like 'Com_______';-- 慢日志查询
show variables like 'slow_query_log';-- 第二种 有分析
select @@have_profiling;-- set profiling = 1;​开启
set profiling = 1-- 查询
show profiles--
show profile for query query_id​

使用explain去判断索引

单例索引 多例索引

三、mvcc(多版本并发控制或者mcc)

3.1、mvcc是什么

多版本并发控制(Multiversion concurrency control, MCC 或 MVCC),是数据库管理系统常用的一种并发控制,也用于程序设计语言实现事务内存。(主要是为了提高数据库的并发性能)
MVCC意图解决读写锁造成的多个、长时间的读操作饿死写操作问题。每个事务读到的数据项都是一个历史快照,并依赖于实现的隔离级别。写操作不覆盖已有数据项,而是创建一个新的版本,直至所在操作提交时才变为可见。快照隔离使得事务看到它启动时的数据状态。

通俗的讲就是MVCC通过保存数据的历史版本,根据比较版本号来处理数据的是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果

同一行数据平时发生读写请求时,会上锁阻塞住。但mvcc用更好的方式去处理读—写请求,做到在发生读—写请求冲突时不用加锁。

当前读

它读取的数据库记录,都是当前最新的版本,会对当前读取的数据进行加锁,防止其他事务修改数据。是悲观锁的一种操作。

  • select lock in share mode (共享锁)
  • select for update (排他锁)
  • update (排他锁)
  • insert (排他锁)
  • delete (排他锁)
  • 串行化事务隔离级别

块照读

快照读的实现是基于多版本并发控制,即MVCC,既然是多版本,那么快照读读到的数据不一定是当前最新的数据,有可能是之前历史版本的数据。

  • 不加锁的select操作(注:事务级别不是串行化)

快照读与mvcc的关系

MVCC是“维持一个数据的多个版本,使读写操作没有冲突”的一个抽象概念。

这个概念需要具体功能去实现,这个具体实现就是快照读。

3.2、Inndb MVCC实现的核心知识点

维基百科

参考文章

个人笔记,不同意见,望有交流
直接可以点击跳转连接

作者: WhyWin

作者: 峰峰峰峰峰

作者: 灼烧的疯狂

作者:尚硅谷

作者 : 王森

作者: IT 老哥 阿里总监求放过,我再也不嘚瑟了,MySQL索引数据结构为什么使用B+树,我来告诉你

作者: 王飞 MySQL数据库中innodb引擎的B+Tree的底部到底时单向链表还是双向链表?

  • List item

作者 李昕羽:MysqlMvcc多版本并发控制实现原理

  • List item

作者 :coldplay.xixi :全网最全的一篇数据库MVCC详解,不全我负责

数据库_mysql数据库引擎_数据库索引相关推荐

  1. mysql数据库重做日志文件_数据库:mysql:重做日志文件(redo log file)

    一.重做日志缓冲(redo log buffer) 1. log block 在InnoDB存储引擎中,重做日志都是以512字节进行存储的.这意味着重做日志缓存.重做日志文件都是以块(block)的方 ...

  2. mysql实验四数据库查询和视图_数据库-第四次实验报告-视图-t-sql语句

    实验十报告 创建视图 实验目的 1.掌握创建视图的SQL语句的用法. 2.掌握使用企业管管理器创建视图的方法. 3.掌握使用创建视图向导创建视图的方法. 4.掌握查看视图的系统存储过程的用法. 5.掌 ...

  3. java数据库查询语句题_数据库查询语句面试

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  4. mysql数据库的环境搭建_数据库学习(一)MySql环境搭建

    一.下载安装包并解压 官网下载地址: https://dev.mysql.com/downloads/windows/installer/ 记住解压目录 二.设置环境变量 打开计算机--属性--高级系 ...

  5. mysql数据库水平拆分例子_数据库水平拆分

    数据库拆分 垂直拆分 数据库垂直拆分就是要把表按模块划分到不同数据库中.微服务架构中每个服务拥有自己独立的数据库,就是典型的垂直拆分.通俗说,就是根据业务类型,把一个数据库中的多张表拆分到多个数据库中 ...

  6. 数据库事务mysql意思_数据库 事务 作用

    事务ACID属性与隔离级别 概念 数据库领域中的事务指的是一系列对数据库的操作集合,是数据库管理系统(DBMS)定义的一个执行单位.事务的作用体现在两个方面: 在并发访问数据库的场景中,利用事务来隔离 ...

  7. 从mysql数据库中读取二进制文件_数据库技术之在MYSQL数据库中如何存取二进制文件...

    [数据库技术之在MYSQL数据库中如何存取二进制文件]在MySQL数据库中,不可以存放文字信息,还可以存放图片.声音.文件等二进制信息.那么在MYSQL数据库中中如何存取二进制文件?下面,武汉宏鹏鲁广 ...

  8. mysql数据库设计三大范式_数据库设计三大范式详解

    引言数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟,不 ...

  9. 命令行导出数据mysql数据库_MySQL命令行导出数据库

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serv ...

最新文章

  1. mysql -d_mysqld
  2. 如何保证高可用?java测试工程师测试的方法
  3. SmartOS之以太网精简协议栈TinyIP
  4. 【C语言】20-static和extern关键字2-对变量的作用
  5. Spring Cloud的全局封装实践
  6. CMD 控制台CMD程序怎么执行完不关闭界面?@pause
  7. 讲一讲应用服务的新鲜事儿
  8. Knockout.js 初探
  9. 腾讯微博android版本,腾讯微博Android V1.2.2版体验
  10. gsp计算机管理系统,速拓医药GSP管理系统pc版
  11. 电信校园网宽带创翼破解,路由器PPPOE拦截法
  12. 多元函数微分学的几何应用
  13. 计算机专业创新创业培养,中职计算机专业学生创新创业能力培养思考
  14. EasyUI多级表头设置
  15. MtaEdt22.exe修改IIS连接数无效的另类解决连接数的方法
  16. oracle安装介绍
  17. Matlab2013a学习之男女的声音识别
  18. R 多变量数据预处理_R语言常用统计方法包+机器学习包(名称、简介)
  19. 码、候选码、主键、主属性
  20. 银行金融 词汇 简写 中英文对照

热门文章

  1. 东北大学c语言课程设计,东北大学C语言(课程设计)程序实践报告.docx
  2. 2017华师在线计算机作业,华师2017春《计算机动画》在线作业
  3. STM32 HAL库学习笔记1-HAL库简介
  4. BIM特点及格式文件说明
  5. 26.空寂无求,禅意悠远
  6. 国际法方向的论文选题能选什么?
  7. Vue开发项目入门——Vue脚手架
  8. 基于NFS共享存储实现kvm虚拟主机动态迁移
  9. 因为计算机丢失vrender,3DMAX打开文件时显示缺少dll解决方案
  10. Git 常用命令练习