MySQL主要知识点

MySQL基础任务

  1. mysql中char和varchar的区别,varchar(100)中的一百的含义,能存放多少汉字?

    char:char是一种固定长度的数据类型,当你定义一个char列时,你需要指定其固定长度。如果实际存储的数据长度小于指定长度,MySQL会在数据后面填充空格使其达到指定长度,如果实际长度超过指定长度,则会被截断。

    varchar:varchar是一种可变长度的数据类型,当你定义一个varchar列时,你需要指定其最大长度,实际存储的数据长度可以在0到该最大长度之间。varchar只会占用实际存储的数据长度加上一两个字节的长度信息。

    对于varchar(100)中的一百的含义,这里的一百代表该字段能够存储的最大字符数,而不是字节数。在UTF-8编码下,一个汉字通常占用3个字节,所以varchar(100)能够存储大约33个汉字(100/3≈33),具体存放多少汉字还取决于每个汉字所占用的字节数。

  2. Mysql:左查询的特点,左右查询的区别?

    左查询:除了返回满足连接条件的行,还会返回左表中不满足条件的行 ,当没有匹配的行时, 结果表中相应的列为空(NULL)。

  3. mysql的约束有哪些?分别有什么作用?

    • 根据约束起的作用,约束可分为:
      • NOT NULL 非空约束,规定某个字段不能为空
      • UNIQUE 唯一约束规定某个字段在整个表中是唯一的
      • PRIMARY KEY 用于唯一标识表中的每一行数据。主键的值不能重复且不能为空,一个表只能有一个主键。
      • FOREIGN KEY 用于建立表与表之间的关联关系。外键约束将一个表的列与另一个表的主键或唯一键进行关联。
      • CHECK 限制列中数据的取值范围,确保满足特定条件的数据被插入或更新。
      • DEFAULT 为列提供默认值,避免插入新记录时需要手动指定每个列的值。

    注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果

  4. where和having的区别?

    WHERE子句用于对行进行过滤,而HAVING子句用于对分组后的结果进行过滤。
    WHERE子句在查询过程中先执行,而HAVING子句在数据分组之后执行。
    WHERE子句作用于行级别的数据,而HAVING子句作用于分组级别的数据。

  5. mysql中分页如何实现?

    在整个SELECT语句的最后使用此格式完成分页:LIMIT [位置偏移量,] 行数

  6. 数据库中, drop、delete与truncate的区别?

    • DROP用于删除数据库对象

      • DROP操作将完全删除对象及其相关数据和定义
    • DELETE用于删除表中的行

      • DELETE操作是逐行删除,并可回滚
    • TRUNCATE用于删除表中所有的行

      • TRUNCATE操作快速清空表中的数据,并且不可回滚。。
    • DROP和TRUNCATE都需要适当的权限才能执行。

  7. 数据库索引是什么,有什么作用?

    数据库索引是一种用于优化数据库查询性能的数据结构。它可以使数据库的查询操作更加高效,从而减少查询所需的时间和资源。

  8. 如何判断一个sql有没有做索引?

    1. 执行查询计划:在大多数数据库管理系统中,您可以使用 EXPLAINEXPLAIN PLAN 命令来执行查询计划,查看数据库优化器在执行查询时选择的执行计划。如果查询使用了索引,您应该在查询计划中看到相关的索引信息。

    2. 查看索引统计信息:通过数据库管理系统提供的系统表或视图,您可以查看表的索引统计信息。例如,在 MySQL 中,您可以使用 SHOW INDEX FROM table_name; 命令来查看表的索引信息。

    3. 使用性能分析工具:一些数据库管理系统提供性能分析工具,可以帮助您分析 SQL 查询的性能并显示查询是否使用了索引。这些工具通常会提供详细的执行计划和索引使用信息。

    4. 监控工具:使用数据库监控工具可以实时监视数据库的性能指标,包括索引使用情况。这些工具可以帮助您确定哪些查询频繁使用了索引,哪些没有使用索引。

    5. 查看执行日志:查看数据库的执行日志或查询日志,可以帮助您了解每个查询的执行情况,包括是否使用了索引。

    6. 手动检查 SQL 查询:在编写 SQL 查询时,可以手动检查查询语句中是否使用了索引。通常,在 WHERE 子句中使用列名,并且查询条件与索引列匹配时,数据库优化器会选择使用索引。

  9. 数据库事务是什么,事务的四大特征有哪些?

    多条DML语句的执行同时成功或同时失败

    事务的四个特性

    • 原子性:事务是一个不可再分的工作单位,事务在执行时,要么不做,要么全做。
    • 一致性:所有事务要求,在同一个事务中,所有的操作必须同时成功,或者同时失败
    • 隔离性:如果多个事务并发执行,一个事务的执行不能被其他事务干扰
    • 持久性:一个事务一旦提交,相当于没有保存到硬盘上的数据保存到硬盘上
  10. 事务并发操作会产生什么问题,事务的隔离级别是什么,mysql默认的隔离级别是?

    数据库中读取数据存在的三大问题:(三大读问题)

    • 脏读(dirty read):一个事务读到其它事务未提交的数据。

    • 不可重复读:在同一个事务当中,第一次和第二次读取的数据不一样。

    • 幻读:读到的数据是假的。

    事务和事务之间的隔离级别有四个级别:

    • 读未提交:read uncommitted(最低的隔离级别):事务A可以读取到其他事务未提交的数据

      • 存在的问题:存在脏读现象
    • 读已提交:read committed:事务A 只能 读取到其他事务提交后的数据

      • 存在的问题:解决了脏读的现象,但存在不可重读现象
      • 这种隔离级别是比较真实的数据,每一次读到最真实的数据
      • oracle数据库默认的隔离级别是read committed
    • 可重复读:repeatable read

      • **事务A开启后,只要不提交事务A,每一次在事务A中读到的数据都是一致的,**即使事务B将数据修改并且提交了,事务A读取到的数据还是之前的
      • 存在的问题:每一次读取到的数据都是幻象,不够真实
      • 是mysql中默认的事务隔离级别
    • 序列化:serializable(最高的隔离级别)

      • 效率最低,解决了所有的问题,这种隔离级别表示事务排队,不能并发,每一次读到的数据都是最真实的
  11. 请阐述数据库设计的范式是什么,有哪些范式,我们日常开发中要,这些范式是否都要遵循?

    数据库设计的范式是一组规范,用于指导数据库表的设计,以减少数据冗余和提高数据的一致性。范式可以分为多个级别,每个级别都有特定的规则和要求。

    以下是常见的数据库设计范式:

    第一范式(1NF):要求数据库表中的每个属性具有原子性,即每个属性都不可再分。

    第二范式(2NF):在满足1NF的基础上,要求非主键属性完全依赖于主键,即非主键属性不能部分依赖于主键。这样可以消除非主键属性之间的冗余。

    第三范式(3NF):在满足2NF的基础上,要求非主键属性之间不存在传递依赖,即非主键属性不能依赖于其他非主键属性。这样可以消除非主键属性之间的传递依赖。

    BCNF 4NF 5NF 了解

  12. 表和表存在哪些关联关系,针对这些关系,我们如何设计表?

    在数据库中,表与表之间可以存在多种关联关系,包括以下几种:

    一对一关系(One-to-One):一个实体记录与另一个实体记录之间存在唯一对应的关系。

    一对多关系(One-to-Many):一个实体记录与另一个实体记录之间存在一对多的关系。

    多对一关系(Many-to-One):多个实体记录与另一个实体记录之间存在多对一的关系。

    多对多关系(Many-to-Many):多个实体记录与另一个实体记录之间存在多对多的关系。

    在设计表时,我们需要根据不同的关联关系来决定如何组织表的结构。以下是一些设计原则:

    一对一关系:对于一对一关系,可以将相关的字段放在同一个表中,也可以将其拆分为两个表。如果关联的字段很少,并且该关系不经常变化,可以考虑将其合并在同一个表中。如果关联的字段较多,并且需要频繁进行查询或更新,可以将其拆分为两个表,并使用主键和外键进行关联。

    一对多关系:对于一对多关系,通常将多的一方作为主表,将关联的一方作为从表,并使用外键将两个表关联起来。从表中的外键指向主表中的主键。

    多对一关系:多对一关系与一对多关系相反,通常将关联的一方作为主表,将多的一方作为从表,并使用外键将两个表关联起来。从表中的外键指向主表中的主键。

    多对多关系:对于多对多关系,通常需要引入一个中间表来实现关联。这个中间表包含两个外键,分别指向两个相关的实体表。

  13. Mysql的存储过程是什么,有什么作用?

    MySQL的存储过程是一组为了完成特定任务而预先编译并存储在数据库中的SQL语句集合。存储过程可以包含SQL查询、控制流语句、变量定义和其他逻辑,类似于程序中的函数或过程。

    存储过程的作用包括但不限于以下几点:

    提高性能:存储过程可以减少数据库与应用程序之间的通信次数,从而提高数据库操作的性能。存储过程在服务器端执行,减少了数据传输的开销。

    简化复杂操作:通过存储过程,可以将复杂的业务逻辑封装在一个单独的单元中,使代码更易维护和管理。

    增强安全性:存储过程可以在数据库服务器上执行,可以设置权限控制,限制用户对数据库的操作,提高数据的安全性。

    减少重复性代码:通过存储过程,可以避免在应用程序中编写重复性的SQL语句,提高代码的重用性和可维护性。

    事务控制:存储过程可以包含事务控制语句,确保一组操作要么全部成功,要么全部失败,保持数据的一致性。

  14. 写sql语句,查询班里170以上男生的人数大于5的班级及其人数

    SELECT class_id, COUNT(student_id) AS student_count
    FROM students
    WHERE gender = 'male' AND height > 170
    GROUP BY class_id
    HAVING COUNT(student_id) > 5;
    
  15. 场景题:游戏背包的里面的物品,设计数据库表格

    对于游戏背包里面的物品,你可以设计两个表格来存储相关信息:一个是存储 物品信息 的表格,另一个是存储玩家 背包中物品 的表格。以下是一个简单的设计示例:
    
    物品信息表格 items:
    
    item_id:物品ID(主键) 
    name:物品名称
    description:物品描述
    type:物品类型(如武器、防具、药水等)
    rarity:物品稀有度(如普通、稀有、史诗等)
    
    玩家背包表格 player_inventory:
    
    inventory_id:背包中物品ID(主键)
    player_id:玩家ID
    item_id:物品ID(外键,关联到 items 表格)
    quantity:物品数量
    equipped:是否装备(0表示未装备,1表示已装备)
    

进阶任务

  1. 说一下InnDB 的索引结构?

    InnoDB 使用 B+ 树索引结构,包括聚簇索引和辅助索引。聚簇索引将数据按主键顺序存储,提高主键查询效率;辅助索引用非主键列值和行指针构成,需二次查找。另外,InnoDB 还支持自适应哈希索引用于加速等值查询。整体上,InnoDB 的索引结构灵活高效,能满足不同查询需求。

  2. 索引的数据结构是什么?

    通常采用 B 树(包括 B+ 树)这样的平衡多路搜索树结构,以提高数据库查询的效率和性能。

  3. 什么时候索引失效,为什么失效?

    索引失效通常是由于查询条件不匹配、隐式数据类型转换、函数操作、表达式索引、数据量过小或数据更新频繁等原因导致的。在设计和使用索引时,需要仔细考虑这些因素,以确保索引能够有效地提升查询性能。

  4. 什么是索引回表,如何避免?

    索引回表是指在使用辅助索引(非聚簇索引)进行查询时,还需要回到聚簇索引中查找对应的数据行。这种额外的查找操作会增加磁盘 I/O 操作,降低查询性能。

    要避免索引回表,可以采取以下方法:

    覆盖索引:创建一个包含查询所需列的复合索引,这样查询就可以直接从索引中获取所需数据,而不需要回表操作。通过覆盖索引,可以避免回表带来的额外开销。

    调整查询语句:优化查询语句,尽量使用聚簇索引进行查询。如果查询条件和排序字段与聚簇索引相匹配,数据库引擎可以直接利用聚簇索引进行查询,避免了回表操作。

    避免不必要的列查询:只查询需要的列,避免将整行数据都加载到内存中。这样可以减少磁盘 I/O 操作和网络传输开销。

    合理设计索引:根据实际的查询需求和数据访问模式,合理设计索引。选择合适的索引列、索引类型和索引顺序,以最大程度地减少回表操作。

    考虑冗余数据:在某些情况下,可以考虑引入冗余数据来避免回表操作。将需要频繁查询的字段冗余到辅助索引中,使得查询可以直接从辅助索引中获取所需数据,而不需要回表。

  5. 数据库优化方式?

    索引优化:合理设计和使用索引,包括选择合适的索引列、索引类型、覆盖索引等,以减少查询时间和提高查询效率。

    查询优化:优化 SQL 查询语句,包括避免全表扫描、减少不必要的列查询、合理使用 JOIN 操作等,以提高查询效率。

    表结构优化:合理设计表结构,包括适当拆分大表、规范化冗余数据、合理选择数据类型等,以减少存储空间占用和提高查询效率。

    硬件优化:合理配置硬件资源,包括调整内存大小、磁盘类型和网络带宽,以提高数据库的整体性能。

    缓存优化:合理使用数据库缓存,包括查询结果缓存、查询计划缓存等,以减少数据库访问次数和减轻数据库负担。

    查询分析:通过查询分析工具(如慢查询日志、性能监控工具等)对数据库进行性能分析,并发现潜在的性能瓶颈和优化点。

    定期维护:定期进行数据库的维护工作,包括索引重建、统计信息更新、碎片整理等,以保持数据库的良好性能。

    并发控制优化:合理设计并发控制策略,包括事务隔离级别、锁粒度、锁管理等,以提高数据库的并发处理能力。

    数据库配置优化:合理配置数据库参数,包括缓冲区大小、连接池大小、日志记录级别等,以提高数据库的整体性能。

    主从分离 多个数据库建立的集群 选择最优

    保持一致 基于语句复制 基于数据的复制 数据库采用混合制

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值