1.关系型数据库(Relational Database)与非关系型数据库(NoSQL)的区别

关系型数据库的优点:

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

非关系型数据库的优点:

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

Advantages of relational databases:

  • Easy to understand. Because it uses the relational model to organize data.
  • Can maintain data consistency.
  • Lower overhead for data updates.
  • Supports complex queries (queries with WHERE clauses)

Advantages of non-relational databases:

  • No need for SQL layer parsing, high read and write efficiency.
  • Based on key-value pairs, excellent data scalability.
  • Can support storage of multiple data types, such as images, documents, etc.

非关系型数据库

如Mongodb,Redis,采用键值对存储数据,读写性能高,易于扩展,适用于:

  • 日志系统(大量写入)
  • 地图数据(灵活数据模型)
  • 数据量巨大 (水平扩展,增加服务器以增加速度)

Such as MongoDB and Redis, which use key-value pairs to store data, have high read and write performance, are easy to scale, and are suitable for:

  • Log systems (high-volume write operations)
  • Map data (flexible data models)
  • Massive amounts of data (scale horizontally)

2.请解释主键、外键和索引的概念。

  • 主键:唯一标识表中每行的列,确保数据唯一性。
  • 外键:建立表间关系,指向另一表的主键。
  • 索引:对于经常查询的列,创建索引,对某一列或多个列的值进行预排序。该列的值如果越互不相同,那么索引效率越高。

    3.什么是事务?请解释ACID特性。

    事务是一系列数据库操作的逻辑单元,它要么全部成功执行,要么全部回滚。这样可以确保数据库始终保持一致的状态。ACID是指原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
    让我们通过一个在线购物的例子来详细说明ACID特性:
  1. 原子性(Atomicity):原子性确保事务中的所有操作要么全部成功,要么全部回滚。假设用户购买了两件商品,并进行了支付操作。该事务包括扣除用户账户金额、更新库存以及生成订单等操作。如果任何一步操作失败,比如库存不足,整个事务将会回滚,用户账户金额不会被扣除,库存也不会发生变化。
  2. 一致性(Consistency):一致性确保事务的执行不会破坏数据库的完整性约束。例如,用户进行购买操作时,系统需要确保购买的商品存在于商品列表中,否则事务将被回滚,以保持数据库的一致性。
  3. 隔离性(Isolation):隔离性确保并发执行的事务彼此相互隔离,互不干扰。假设有两个用户同时购买同一件商品。每个用户的购买操作都应该独立进行,并且彼此之间不应该相互干扰。数据库系统通过锁定机制和并发控制来保证事务的隔离性。
  4. 持久性(Durability):持久性确保一旦事务提交,其结果将永久保存在数据库中,即使发生系统故障或崩溃。例如,如果用户成功购买商品并支付,一旦事务提交,订单和账户信息将被持久化保存,即使在系统重启后,这些数据也不会丢失。
    广告

4. mysql存储引擎

  • InnoDB
  • MyISAM
  • Memory

5. 为什么使用索引

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度
  • 帮助服务器避免排序和临时表
  • 将随机IO变为顺序IO。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

Why use indexes?

  • ensure the uniqueness of each row of data.
  • It can greatly speed up data retrieval
  • Helps the server avoid sorting and temporary tables
  • Converts random IO to sequential IO.
  • It can accelerate the connection between tables, which is especially meaningful in implementing data referential integrity.

6.连接 join

分类

  • 合并 LEFT JOIN 与 RIGHT JOIN来模拟FULL join
    1
    select A.id,A.name,B.name from A,B where A.id=B.id;
  • INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。
    1
    select * from A inner join B on A.name = B.name;
    alt text
    alt text
  • LEFT JOIN(左连接):
    1. 取得左表(table1)完全记录,即使右表(table2)并无对应匹配记录。如果没有匹配,记录为null
      1
      2
      select * from A left join B on A.name = B.name;
      //或者:select * from A left outer join B on A.name = B.name;
      alt text
  1. 如果想只从左表(A)中产生一套记录,但不包含右表(B)的记录,可以通过设置where语句来执行
    alt text
  2. 模拟inner join
    1
    select * from A left join B on A.name=B.name where A.id is not null and B.id is not null;
  • RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录。
    1
    select A.id,A.name,B.name from A,B where A.id=B.id;

7.mysql优化

  • 为搜索字段创建索引

    • MySQL会为索引列创建一个类似于书籍目录的数据结构(通常是B-tree)。这个结构允许数据库快速定位到特定的值,而不需要扫描整个表。
  • 避免使用 Select *,列出需要查询的字段
  • 垂直分割分表
  • 选择正确的存储引擎

  • Create indexes for search fields

  • Avoid using Select *, list the fields that need to be queried
  • Vertical partitioning of tables
  • Choose the correct storage engine

Innodb为什么要用自增id作为主键?

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE (optimize table) 来重建表并优化填充页面。

Why does InnoDB use auto-increment ID as the primary key?

mysql内部构造

Server 层

  • Connection Layer /连接层 (通信协议、线程处理、用户名密码认证)
  • Service Layer /SQL 层(服务层):系统管理及控制工具(Management Services & Utilities)、SQL接口(SQL Interface)、解析器(Parser)、优化器(Optimizer)、缓存(Caches & Buffers)

Storage Engines

文件系统层(存储层)

Drop /Delete/Truncate 共同点&区别

MyISAM和InnoDB实现B-tree的索引方式区别