数据库基础01 - MySQL

1. 什么是MySQL?

        MySQL是一种关系型数据库,所谓的关系型数据库,是建立在关系模型基础之上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。在Java企业级开发中非常常用,因为它是开源免费的,并且方便扩展。可以用SQL语句方便的在一个表及其多个表之间做非常复杂的数据查询。安全性高。

MySQL默认端口为3306。

常见的数据库总结:常见的数据库

2. 什么是非关系型数据库?

        非关系型数据库也叫NOSQL,采用键值对的形式进行存储。它的读写性能很高,易于扩展,可分为内存性数据库以及文档型数据库,比如 Redis、Neo4j、Mongodb、HBase等等。适合使用非关系型数据库的场景有日志系统、地理位置存储、数据量巨大等等。

3. 关系型数据库和非关系型数据库的区别

(1)关系型数据库的优点

  • 容易理解。因为它采用了关系模型来组织数据。
  • 可以保持数据的一致性。
  • 数据更新的开销比较小。
  • 支持复杂查询(带where子句的查询)

(2)非关系型数据库的优点

  • 不需要经过SQL层的解析,读写效率高。
  • 基于键值对,数据的扩展性很好。
  • 可以支持多种类型数据的存储,如图片,文档等等。

2. 存储引擎

(1)一些常见命令

查看MySQL提供的所有存储引擎:show engines;

查看MySQL当前默认的存储引擎:show variables like '%storage_engine%';、

查看表的存储引擎:show table status like "table_name" ;

        MySQL 当前默认的存储引擎是 InnoDB,并且在5.7版的所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。

(2)MyISAM和InnoDB的区别

        MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽性能极佳,且提供了大量的特性,包括全文索引、压缩、空间函数等,但 MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL 引入了 InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为 InnoDB。 大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的(不考虑并发安全问题),比如读密集的情况下。

(3)MyISAM和InnoDB的对比

        01 是否支持行级锁 : MyISAM 只有表级锁,InnoDB 支持行级锁和表级锁,默认为行级锁。

        02 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但不提供事务支持。但是InnoDB 提供事务支持,是具有提交(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全型表。

        03 是否支持外键: MyISAM不支持,InnoDB支持。

行级锁:将查询结果集在表中对应的记录,开始锁住,在当前事务结束前,别的事务根本修改不了锁住的数据。行级锁也称为悲观锁。而乐观锁是什么呢?

乐观锁会在数据后面添加一个隐藏的版本号,假设为version,只要事务读取到的版本号没有改变,事务就能对数据进行修改。

5. 字符集及校对规则

        字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序规则。 MySQL中每一种字符集都会对应一系列的校对规则。 MySQL采用的是类似继承的方式指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值, 他们逐层继承。比如:某个库中所有表的默认字符集将是该数据库所指定的字符集(这些表在没有指定字符集的情况下,才会采用默认字符集)。

6. 索引

        索引是对数据库中的一列或多列的值进行排序的一种结构。MySQL 索引的建立是为了加快数据查询速度

📌简单类比一下,数据库如同书籍,索引如同书籍目录,假如我们需要从书籍查找与 xx 相关的内容,我们可以直接从目录中查找,定位到 xx 内容所在页面,如果目录中没有 xx 相关字符或者没有设置目录(索引),那只能逐字逐页阅读文本查找,效率可想而知。

       MySQL 索引使用的数据结构主要有 B 树索引和哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部场景,建议选择B树索引。

        MyISAM 和 InnoDB只支持B+树索引

         MySQL的B树索引使用的是B树中的B+树。B+树是B树的变体。B树和B+树最大的区别在于非叶子节点是否存储数据。

        B树和B+树的介绍:B树和B+树

(1)实现B树索引的方式有什么区别?

        MyISAM:B+ 树叶子节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+ 树搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。

        InnoDB:其数据文件本身就是索引文件。MyISAM 中索引文件和数据文件是分离的,而 InnoDB 表数据文件本身就是按 B+ 树组织的一个索引结构,树的叶子节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引”。而其余的索引都作为辅助索引,辅助索引的 data 域存储相应记录主键的值而不是地址,这也是和 MyISAM 不同的地方。在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

7. 都知道数据库索引采用B+树而不是B树,主要原因是什么?

        B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

8. MySQL优化?从哪些方面可以做到性能优化?

  • 为搜索字段创建索引
  • 避免使用 Select *,列出需要查询的字段
  • 垂直分割分表
  • 选择正确的存储引擎

9. MySQL的执行流程?/ 如何执行一条SQL语句的?

(1)MySQL的架构 / 内部结构

        从上图可看出,MySQL 的架构共分为两层:Server 层和存储引擎层。

        01  Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。

        02  存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB,从 MySQL 5.5 版本开始, InnoDB 成为了 MySQL 的默认存储引擎。我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

(2)执行一条SQL的流程

        MySQL是基于TCP协议进行传输的。

  1. 客户端请求->
  2. 连接器(验证用户身份,给予权限),先通过三次握手建立连接,连接成功后验证用户名与密码  ->
  3. 查询缓存(存在缓存则直接返回,不存在则执行后续操作)->
  4. 分析器(对SQL进行词法分析和语法分析操作) ->
  5. 优化器(主要对执行的sql优化选择最优的执行方案方法) ->
  6. 执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)->
  7. 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)

10. Drop、Delete和Truncate的共同点和区别

Drop、Delete、Truncate都表示删除,但是三者有一些差别。

      01 Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

     02 Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。

    03 Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小。

因此,在不再需要一张表的时候,用Drop;在想删除部分数据行时候,用Delete;在保留表而删除所有数据的时候用Truncate。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值