SQL基础

NOSQL和SQL的区别

  • NOSQL: 非关系型数据库,更加宽松的模型BASE, 即基本可用,软状态和最终一致性
  • SQL:关系型数据库,支持ACID,原子性、一致性、隔离性、持续性

数据库三大范式

  • 第一:原子项
  • 第二:非码属性完全依赖于候选码,而不是单独某一个部分(部分函数依赖
  • 第三:消除了传递依赖

联表查询

image.png

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN 需要使用UNION来实现

如何避免重复插入数据

  • 使用UNIQUE
  • 使用INSERT ... ON DUPLICATE KEY UPDATE 如果有记录冲突,可以选择进行更新
  • 使用INSERT IGNORE INTO 来避免冲突

CHARVARCHAR有什么区别

  • CHAR:固定长度,末尾补空格,短字符效率跟高
  • VARCHAR:可变长度的字符串类型,定义时需要指定最大长度,适合存储可变长度的数据

VARCHAR(10)这种是什么意思

  • 如果是ASCII字符集,每个字符占用一个字节,那么这最多可以存储10个ASCII字符,同时占用的空间最多为10个字节
  • 如果是UTF-8字符集,他的每个字符可能占用1-4个字节,他最多是存储10个字符

int(1)int(10)在MySQL上有什么不同

  • int在mysql占用的也是4个字节
  • 数值代表的是宽度,int(1)只会填充一个宽度,int(10)会填充10个宽度,然后不够的前面补0

text数据类型可以无限大吗

  • text是$2^{16}$,也就是64kb
  • Mediumtext是$2^{24}$,即16MB
  • longtext是$2^{32}$,也就是4GB

IP地址如何在数据库中存储

  • ipv4是32个bit,可以选择字符串存储,也就是varchar(15)
  • 可以进行unsigned int的方式进行存储

外键约束是什么

  • primary key ... references ...保证了数据的一致性

INexist区别

  • WHERE condition IN (VALUE1,VALUE2...) 查询的是在里面的值的情况
  • WHERE condition EXIST ...判断是的一个bool类型,所以当判断找到条件就停止判断,返回true,效率更高

MySQL中的一些基本函数

  • 日期函数MONTH(NOW()),
  • 聚合函数COUNT(*),SUM()
  • 数值函数ABS()

查询语句的基本顺序是什么

  • 查询都是从FROM开始执行,生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入,每一个步骤都会生成一个虚拟表,最后一个步骤产生的虚拟表即为输出结果
  • image-20251214083419811

存储引擎

SQL指令的执行过程

image.png

  • 连接器:建立和管理连接,检验用户的身份
  • 查询缓存:有则直接返回结果
  • 解析器:sql语句进行词法,语法的分析,构建语法树等
  • 执行器:预处理/优化/执行

对于MySQL引擎的了解

  • INNODB,MySQL默认的存储引擎,支持ACID事务支持,行级锁,外键约束等特性,适用于高并发的读写操作
  • MyISAM,另一种常见的存储引擎,具有较低的存储空间和内存消耗,适用于大量的读写操作的场景
  • Memory,将数据存储在内存中,因此对性能要求较高的读操作,但是服务器重启或崩溃时数据会丢失

数据文件大体分为哪几类

  • db.opt:存储当前数据库默认的字符集和字符检验规则
  • t_order.frm:保存表的结构
  • t_order.ibd:保存表的数据

索引

索引是什么,有什么特性

  • 没有索引,会进行全表的扫描查询,时间复杂度为$O(n)$
  • 有索引,可以基于二分查找的算法,一般的数据结构为b+树,查询的时间复杂度为$O(log{dN})$

索引分类

  • 数据结构分类:b+树,hash,full-text

    image-20251214090015080

  • 物理存储:聚簇索引,二级索引

    • 主键索引的b+树叶子节点存放的是实际数据
    • 二级索引的b+树存放的是主键值
    • 如果查询数据的时候,数据能在二级索引查询得到,就不需要回表,否则需要回表,这个过程叫做覆盖索引
  • 字段特性:主键索引,唯一索引,普通索引,前缀索引

    • 主键索引:创建表的时候建立在主键字段上的索引
    • 唯一索引:建立在UNIQUE字段上的索引
    • 普通索引:建立在普通字段
    • 前缀索引:针对字符串类型的前几个字符建立的索引
  • 字段个数:单列索引,联合索引

    • 单列索引:建立在单列上的索引
    • 联合索引:建立在多列上的索引,通过将多个字段组合成一个索引,该索引就被称为联合索引,这种索引的情况下使用的是最左匹配原则

哈希索引的使用场景

  • 查询速度快,通过哈希函数计算数据位置来定位获取数据
  • MEMORY数据引擎中,比方讲缓存用户登录信息,通过用户ID快速查找对应的登录状态等信息,能够直接通过用户ID来计算哈希值,定位数据所在的桶,查询效率接近$O(1)$

聚簇索引和非聚簇索引的区别是什么

  • 数据索引:是否包含有实际的数据行
  • 索引与数据关系

聚簇索引的存储更新,数据会不会发生变化

MySQL的主键时聚簇索引吗

什么字段适合当主键

性能字段能加索引吗

表中有十个字段,用ID还是UUID

为什么自增ID快于UUID

MySQL中的索引是怎么实现的

B+树查询到了叶子节点之后会怎么作

B+树的特性是什么

B+树和B树的区别

B+树的好处是什么

B+树的叶子节点是单向还是双向,为什么

MySQL为什么采用B+树结构

MySQL为什么不使用跳表

联合索引的实现原理

创建联合索引需要注意什么

联合索引的场景题

索引失效有哪些

什么时候会有回表查询

覆盖索引是什么

单列索引,又是联合索引,单独查的话会先怎么走

索引建好了之后再插入数据会怎么样

索引字段是不是越多越好

status的值为0 or 1时,适合建索引吗

索引的优缺点

怎么决定建立哪些索引

索引优化怎么做

前缀索引是什么

事务

日志

性能调优

架构