MySQL体系结构和存储引擎「连环问」

137 阅读5分钟

1、关系型数据库和非关系型数据库区别,优缺点?

*** 是两种不同的数据存储方式。

关系型数据库(如Oracle、MySQL、SQL Server等):采用了关系模型来组织数据。它由二维表结构组成,每个表由行和列组成,行表示实体,列表示实体的属性。关系型数据库通常使用SQL语言进行数据操作。

非关系型数据库(如Redis、MongoDB、HBase):采用了非关系模型来组织数据。非关系模型通常采用键值对、文档、图形等数据结构来存储数据,没有固定的数据表结构,可以灵活地存储不同类型的数据。非关系型数据库通常使用多种编程语言进行开发。

关系型数据库与非关系型数据库的区别体现在数据存储方式扩展方式数据查询语言适用场景的不同。具体可以看上面内容。

  • 关系型数据库的优点:数据结构清晰、易于理解和维护,支持事务处理,能够保证数据的完整性和一致性,并且支持多用户访问

  • 非关系型数据库的优点:具有较好的扩展性和性能,对于非结构化数据的存储和处理能力较强,并且具有较好的灵活性和敏捷性

  • 关系型数据库的缺点:(与非关系型数据库的优点相反)

  • 非关系型数据库的缺点:数据结构不够清晰,难以理解和维护,不支持事务处理,容易出现数据完整性和一致性问题,且不够安全,容易受到攻击和数据泄漏

2、一条SQL查询语句是如何执行的?

image.png

  1. 通过连接器跟客户端建立连接
  2. 通过查询缓存查询之前是否有查询过该 sql
    • 有则直接返回结果
    • 没有则执行第三步
  3. 通过分析器分析该 sql 的语义是否正确,包括格式,表等等
  4. 通过优化器优化该语句,比如选择索引,join 表的连接顺序
  5. 验证权限,验证是否有该表的查询权限
    • 没有则返回无权限的错误
    • 有则执行第六步
  6. 通过执行器调用存储引擎执行该 sql,然后返回执行结果

3、MySQL的数据类型有哪些?

  1. 数值型:包括整数类型(int)、小数类型(tinyint)、浮点数类型(float)等。
  2. 字符型:包括定长字符串类型、变长字符串类型、文本类型、枚举类型等。
  3. 日期时间型:date、time、datetime、timestamp

此外,MySQL还支持一些其他的数据类型,例如二进制数据类型、JSON数据类型等。

4、MySQL 支持哪些存储引擎?默认使用哪个?

  • Memory
  • InnoDB(从MySQL5.5.8开始,为默认存储引擎)
  • MyISAM(在MySQL5.5.8以前,为默认存储引擎)
  • Federated
  • Blackhole
  • ...

可通过show engines 命令来查看 MySQL 支持的所有存储引擎;可通过 select version() 命令查看 MySQL 版本。

特征MyISAMInnoDBMEMORY
事务安全不支持支持不支持
锁机制表锁表锁/行锁表锁
外键不支持支持不支持

InnoDB

  • 介绍
    • InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。
  • 特点
    • DML操作遵循ACID模型,支持事务
    • 行级锁,提高并发访问性能
    • 支持外键 FOREIGN KEY约束,保证数据的完整性和正确性
  • 文件
    • xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。
    • xxx.frm存储表结构(MySQL8.0时,合并在表名.ibd中)

5、MyISAM 和 InnoDB 有什么区别?

6、MyISAM 和 InnoDB 如何选择?

一般情况下,选择InnoDB存储引擎可以获得更好的数据完整性一致性并发性能,适用于高并发、事务处理等场景。而选择MyISAM存储引擎则适用于只读或只追加数据的场景,如报表和日志文件等应用。需要注意的是,MyISAM不支持事务和外键,所以在数据完整性和一致性要求高的场景中,应选择InnoDB存储引擎。

7、数据库三大范式

  • 第一范式:数据库中的字段具有原子性,不可再拆分,并且是单一职责(强调原子性

  • 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。例如订单表里,存储了商品信息(商品价格、商品类型),那就需要把商品ID和订单ID作为联合主键,才满足第二范式。

  • 第三范式:建立在第一,第二范式的基础上,确保每列都和主键列直接相关,而不是间接相关不存在其他表的非主键信息

在我们的日常开发当中,并不是所有的表一定要满足三大范式,有时候冗余几个字段可以少关联几张表,带来的查询效率的提升有可能是质变的