目录
前言
数据库是一个组织数据的集合,它是现代数据应用程序的核心,为应用程序提供了一种有效地存储和访问数据的方式。在IT岗位的面试里数据库的有些问题是不必可少会问到的,最近上网找了许多资料,发现很杂乱。于是就想总结一下最近这段时找的资料,形成一个系统化的数据库和MYSQl的面试题库。这篇文章主要回答比较深入又容易问道的问题。其他简单问题比如事务的四大特性这些的不做讨论。
基础
Q数据库的范式和反范式分别是什么?他们之间有什么联系和区别?
范式是将数据库设计成符合一定规范的过程,可以将重复的数据消除,减少冗余数据,提高数据的一致性和完整性。
反范式是指在设计数据库时,为了提高查询性能而采取的一系列冗余化设计方法。
Q:MYSQl数据库有哪些特点?
-
开源免费
-
可靠性高:MySQL 具有 ACID 的特性,保证了数据的可靠性和一致性。同时,MySQL 的备份和恢复机制也非常完善,可以有效地防止数据丢失。
-
高性能:MySQL 是一种高性能的数据库管理系统,具有较快的读写速度和较高的并发处理能力。它采用了多种优化技术,如索引、缓存、分区等,以提高数据库的性能。
-
可扩展性好:MySQL 可以支持多种存储引擎,用户可以根据自己的需求选择不同的存储引擎来达到最优的性能和可扩展性。
-
安全性高:MySQL 支持多种安全机制,如用户权限管理、SSL 加密传输、数据加密等,以保证数据库数据的安全和隐私。
-
跨平台性好:MySQL 支持多种操作系统和编程语言,包括 Windows、Linux、Mac OS X、PHP、Java 等,以满足不同用户的需求。
Q数据库的数据模型有哪些?
层次模型,网状模型,关系模型
Q:MYSQL有那几个默认数据库?
-
mysql:这是用于存储 MySQL 系统元数据的数据库。
-
information_schema:这是一个只读的数据库,用于存储关于 MySQL 数据库和表的元数据,例如列、索引、表约束等信息。
-
performance_schema:这也是一个只读的数据库,用于收集 MySQL 服务器性能相关的数据,例如 CPU、内存、磁盘和网络使用情况等。
-
sys:用于管理 MySQL 实例的系统信息,例如系统变量、状态信息、用户信息等。
Q数据库的三级模式结构是指什么?
-
外部模式(External Schema):也称为用户模式,是指数据库的用户视图,即用户对数据库中的数据和关系的描述。
-
概念模式(Conceptual Schema):也称为逻辑模式,是指数据库的全局逻辑结构,即整个数据库的数据和关系的描述。
-
内部模式(Internal Schema):也称为存储模式或物理模式,是指数据库在物理存储介质上的存储方式和存储结构。
Q 如何在cmd中如何查询数据库的相关信息?
-
查询已有数据库:输入 "SHOW DATABASES;" 命令
-
进入指定数据库:输入 "USE 数据库名称;" 命令
-
查询当前数据库中的所有表:输入 "SHOW TABLES;" 命令
-
查询表结构信息:输入 "DESCRIBE 表名称;" 命令
-
查询表数据:输入 "SELECT * FROM 表名称;" 命令
-
查询当前存在的所有用户:输入 "SELECT user FROM mysql.user;" 命令
-
查询指定用户的权限:输入 "SHOW GRANTS FOR 用户名;" 命令
-
查询当前用户:输入 "SELECT user();" 命令,按下 Enter 键
Q:如何确定MQSQL服务器是否处于运行状态?
查看进程列表:在任务管理器中,查找名为 "mysqld.exe" 的进程。如果存在 "mysqld.exe" 进程,则说明 MySQL 服务器正在运行中。
Q:MYSQL如何查看和修改系统参数?
-
查询所有参数:输入 "SHOW VARIABLES;" 命令,按下 Enter 键,可以查询所有系统参数及其当前值。
-
查询指定参数:输入 "SHOW VARIABLES LIKE '参数名称%';" 命令,按下 Enter 键,可以查询指定名称的系统参数及其当前值。
Q:如何解决MYSQL中文乱码问题?
修改客户端连接字符集:如果客户端连接字符集与服务器默认字符集不匹配,可以使用以下命令修改客户端连接字符集:SET NAMES '字符集名称'
SQL查询
Q SQL和普通的编程语言有什么不同?
SQL是一种声明式语言,而大多数编程语言则是命令式语言。在SQL中,用户只需描述要执行的操作,而不需要指定如何执行。例如,在SQL中,用户只需指定要查询的数据,而不需要指定如何查询数据,如何排序,如何执行等。
Q:SQL有哪四种类型?他们典型的操作是什么?
-
数据查询语言(Data Query Language,DQL):用于查询表中的数据,包括 SELECT 语句和一些关键字,如 ORDER BY、WHERE、GROUP BY、HAVING 等。
-
数据定义语言(Data Definition Language,DDL):用于定义数据库对象的结构,包括 CREATE、ALTER、DROP 等语句。
-
数据控制语言(Data Control Language,DCL):用于控制数据库的访问权限和安全性,包括 GRANT、REVOKE 等语句。
-
数据操作语言(Data Manipulation Language,DML):用于对表中的数据进行增、删、改操作,包括 INSERT、UPDATE、DELETE 等语句。
Q SQL语句中关键字的执行顺序是怎么样的?
Q in 和exists的的有什么同?
in 适合内表比外表数据小的情况,exists 适合内表比外表数据大的情况。如果查询的内外表大小相当,则二者效率差别不大。
Q:where子句如何优化?
-
索引优化:对于经常使用的 WHERE 子句,可以创建相应的索引来加速查询。
-
条件简化:优化 WHERE 子句的另一个方法是尽量简化查询条件,减少不必要的计算和比较。
-
数据拆分:对于大型数据表,可以将数据拆分为多个小表,以减少查询时需要扫描的数据量。
-
数据缓存:对于经常查询的数据,可以使用缓存将数据保存在内存中,以减少查询时的 I/O 操作和网络传输。例如,可以使用 Redis 等内存数据库存储热点数据,并使用缓存查询代替直接查询数据库。
Q:常见的排名函数有哪些?他们之间有什么不同?
-
RANK():为相同的值分配相同的排名,并跳过下一个排名。例如,如果两个值排名并列第一,则下一个排名为第三名。
-
DENSE_RANK():为相同的值分配相同的排名,但不跳过下一个排名。例如,如果两个值排名并列第一,则下一个排名为第二名。
-
ROW_NUMBER():为每行数据分配唯一的排名值,不考虑相同的值。例如,如果两个值相等,则它们的排名值仍然是连续的。
-
NTILE(n):将查询结果分成 n 个组,并为每组分配排名值。例如,如果 n=4,则每组有 25% 的数据,并分别分配排名值 1、2、3、4。
Q什么是内连接,外连接,交叉链接,笛卡尔积?
-
内连接(Inner Join):内连接是将两个表中符合连接条件的数据行组合在一起的操作。只有在两个表中都存在相同的值时,才会将它们组合在一起
-
外连接(Outer Join):外连接是将两个表中符合连接条件的数据行和不符合条件的数据行组合在一起的操作。外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。
-
交叉连接(Cross Join):交叉连接是将两个表中的所有数据行进行组合的操作,也称为叉积连接。
-
笛卡尔积(Cartesian Product):笛卡尔积是将两个表中的所有数据行进行组合的操作,与交叉连接类似。不同之处在于,笛卡尔积不需要连接条件。
Q:如何对一张表同时进行查询和更新?
-
使用事务进行并发操作。执行成功,要么全部失败回滚。在事务中执行查询和更新操作可以保证数据的一致性和完整性。当一个事务对某个表进行更新时,其他事务无法对该表进行更新,只能等待该事务提交或回滚。因此,事务可以控制并发操作的顺序和互斥访问。
-
使用锁控制并发访问:锁是一种机制,用于控制并发访问,保证数据的一致性和完整性。在 SQL 中,有两种类型的锁:共享锁(Shared Lock)和排它锁(Exclusive Lock)。共享锁用于读取操作,多个事务可以同时持有共享锁,但不能同时持有排它锁。排它锁用于写入操作,只能由一个事务持有。在进行并发操作时,可以使用锁来控制对表的访问,从而避免数据访问冲突。
-
使用乐观锁或悲观锁:乐观锁和悲观锁是两种不同的
Q:数据库有三种SQL删除,分别是哪三种?他们之间有什么区别?
-
DELETE:DELETE 语句用于删除表中的数据行,可以根据指定的条件删除符合条件的数据。
-
TRUNCATE:TRUNCATE 语句用于删除表中的所有数据行,相当于将表清空。
-
DROP:DROP 语句用于删除整个表,包括表结构和数据。DROP 操作会删除整个表,包括表结构、索引、触发器等。
索引
Q:什么是覆盖索引?
覆盖索引,索引本身就包含了所有需要的数据,数据库可以直接从索引中获取数据,而不需要访问数据表。
Q:什么是前缀索引?
前缀索引是一种数据库索引,它只索引了数据列的前缀部分而不是整个列。
Q: 什么是全文索引?
全文索引是一种数据库索引,它允许在文本数据中进行高效的全文搜索,全文索引会对文本数据进行分词,并索引每个词汇出现的位置
Q: 什么是空间索引?
空间索引是一种数据库索引,它用于在包含空间数据的表中进行空间查询和空间分析。空间数据通常包括点、线、多边形和多维数据等
Q:索引的使用原则是什么?
以下列通常适合建立索引:
-
主键列:主键列是表中唯一的标识符,因此通常适合建立索引。
-
外键列:外键列通常与其他表进行关联查询,因此适合建立索引。
-
经常用于查询的列:例如,经常用于筛选和排序的日期、时间、状态等列。
-
经常用于连接操作的列:例如,经常用于连接多张表的列。
-
经常用于分组和聚合操作的列:例如,经常用于统计数量和求和的列。
Q:什么是索引下推?
索引下推技术是先根据索引筛选出符合条件的记录,然后再根据WHERE条件进一步筛选,这样可以减少扫描的数据量,从而提高查询效率。
Q:为什么使用B+树而非二叉查找树做索引?
-
磁盘IO次数更少:B+树是一种多路平衡查从而减少磁盘IO的次数。相比之下二叉树树高度较大,需要进行多次磁盘IO操作。
-
提高查询效率:B+树的可以进行范围查询和顺序访问,从而提高查询效率。相比之下,二叉查找树无法进行范围查询和顺序访问。
-
更适合磁盘存储
-
更适合内存管理
Q:为什么使用B+树而非B树做索引?
-
更适合磁盘存储
-
更适合查询操作
-
更适合内存管理
Q:为什么索引没有被使用?
数据库对象
Q:使用视图有什么好处?
-
简化查询语句:视图可以将复杂的查询语句封装成一个简单的视图,使得查询操作更加方便和简单。同时,视图还可以隐藏底层表的结构和信息,保护数据的安全性。
-
提高数据安全性:视图可以限制用户对数据的访问权限,从而提高数据安全性
-
管理复杂性:视图可以将多个表的数据集成在一个虚拟表中,从而简化查询操作
-
提高性能:视图可以缓存查询结果,从而提高查询性能。
-
提高数据抽象性:视图可以将数据抽象成一种更高层次的概念,从而减少对底层数据结构和实现的依赖。
Q:存储过程和函数有什么不一样的地方?
-
返回值类型:存储过程没有返回值,而函数有返回值。函数的返回值可以是任何数据类型,例如数字、字符串、日期等。
-
调用方式:存储过程可以通过执行语句或存储过程调用语句来调用,而函数只能通过函数调用语句来调用。
-
作用范围:存储过程可以对数据库中的多个表进行操作,并可以包含多个SQL语句,而函数只能对单个表进行操作,并且只能包含一个SQL语句。
-
数据修改:存储过程可以对数据库中的数据进行增、删、改等操作,并且可以包含事务处理语句,而函数只能对数据进行查询操作,不能修改数据。
-
执行效率:存储过程的执行效率通常比函数高,因为存储过程可以预编译,可以缓存执行计划,而函数每次调用都需要重新编译和执行。
事务和锁
Q事务有哪些类型?
-
扁平事务(Flat Transaction):扁平事务是最简单的事务类型,它只包含单个操作,
-
块事务(Block Transaction):块事务是由多个操作组成的事务,
-
嵌套事务(Nested Transaction):嵌套事务是由一个父事务和多个子事务组成的事务,子事务可以单独提交或回滚,并且父事务的提交或回滚会影响所有子事务
-
分布式事务(Distributed Transaction):分布式事务是由多个参与者协作完成的事务。
Q什么是XA事务?
XA事务是一种分布式事务协议,它通过协调多个资源管理器(Resource Manager)来实现跨多个数据库或消息队列的事务一致性。
Q:如何管理MYSQL多实例?
-
使用mysqld_multi工具:mysqld_multi是MySQL官方提供的管理多实例的工具,它可以通过配置文件来管理多个MySQL实例。
-
使用系统服务管理工具:在Linux系统中,可以使用systemd或SysVinit等服务管理工具来管理多个MySQL实例。
-
使用Docker容器:使用Docker容器可以方便地管理多个MySQL实例。
QMYSQL如何查看锁?
使用SHOW ENGINE INNODB STATUS命令
使用:SELECT * FROM information_schema.INNODB_LOCKS;
Q:什么是MVCC以及它是怎样实现的?
MVCC的基本思想是在数据库中为每个数据行维护多个版本,每个版本都有一个时间戳,表示该版本的创建时间。当事务读取数据时,系统返回该事务开始时间之前最新的版本,从而避免了读取到尚未提交的数据。当事务修改数据时,系统会创建一个新版本,并将事务的时间戳记录在新版本中,从而保证其他事务读取的仍然是该数据行的旧版本。
存储引擎
Q:如何选择存储引擎?
-
InnoDB:InnoDB是MySQL的默认存储引擎,支持事务、行级锁、外键等特性。适合于需要事务支持的应用,例如电子商务、支付系统等。
-
MyISAM:MyISAM是MySQL的另一个常用存储引擎,不支持事务和行级锁,但具有较高的性能和较小的存储空间。适合于读密集、写少的应用,例如博客、新闻等。
-
MEMORY:MEMORY存储引擎将数据存储在内存中,具有极高的查询性能,但数据会随着MySQL服务的停止而丢失。适合于存储临时数据、缓存等。
-
NDB Cluster:NDB Cluster是MySQL的集群存储引擎,支持高可用、分布式存储和事务等特性,适合于需要高可用和大规模存储的应用。
Q:InoDB四大特性指的是什么?怎么理解?
-
事务支持:InnoDB支持ACID事务,保证了数据的一致性和完整性。
-
行级锁:InnoDB支持行级锁,可以在并发访问时保证数据的一致性和并发性。
-
外键约束:InnoDB支持外键约束,可以保证数据的完整性。
-
热备份:InnoDB支持在线备份和热备份,可以在不停止MySQL服务的情况下进行备份。
Q:InnoDB为什么推荐使用自增主键?
-
自增主键可以提高插入性能
-
自增主键可以减少索引碎片
-
自增主键可以减少主键冲突:如果使用非自增主键,那么可能会出现主键冲突的情况,从而导致插入失败。而自增主键可以保证每个记录的主键值是唯一的,从而避免主键冲突的情况。
Q:MYSQL的存储结构是什么样子的呢?
日志
Q:MYSQL有哪些日志文件?
-
二进制日志(Binary log):用于记录所有写入数据库的操作,包括插入、更新、删除等,以便能够在主从复制以及数据恢复操作中使用。
-
慢查询日志(Slow Query Log)
-
错误日志(Error Log):用于记录MySQL服务器发生的错误信息,例如启动和关闭过程中的错误、运行时出现的错误等。
-
查询日志(Query Log):用于记录所有的客户端查询请求,包括查询语句、连接信息等,以便进行查询分析和优化。
-
事务日志(Transaction Log):用于记录事务的操作,包括事务的开始、提交、回滚等,以便在崩溃恢复和数据恢复操作中使用。
-
中继日志(Relay Log)
Q:常见数据备份的方法有哪几种?
-
完全备份(Full Backup):完全备份是指备份整个数据库或文件系统的所有数据,包括所有表、索引和数据文件。这种备份方法可以完全恢复数据,但备份和恢复的时间和成本都比较高。
-
增量备份(Incremental Backup):增量备份是指备份数据库或文件系统中的增量数据,即备份上一次完全备份后发生的更改。
-
差异备份(Differential Backup):差异备份是指备份数据库或文件系统中自上一次完全备份以来发生的所有更改,而不是自上一次备份以来的增量数据。
-
冷备份(Cold Backup):冷备份是在关闭数据库或文件系统后进行备份的一种方法,
-
热备份(Hot Backup):热备份是在数据库或文件系统运行时进行备份的一种方法,可以在备份时不停止业务操作,备份时间较短,备份频率较高,适合需要实时备份的场景。但是,热备份需要特殊的备份工具和技术,备份的数据可能存在一定的风险和不确定性
Q:什么叫主从复制?
主从复制(Master-Slave Replication)是MySQL数据库中常用的一种数据复制技术,用于将一个MySQL服务器上的数据实时复制到另一个或多个MySQL服务器上,以实现数据备份、负载均衡和高可用性等目的。
在主从复制中,有一个主服务器(Master)和一个或多个从服务器(Slave)。主服务器负责处理所有的写操作(如插入、更新、删除等),从服务器则复制主服务器上的数据,并提供读操作服务。从服务器可以接收主服务器的变更日志,然后应用这些日志来更新自己的数据,以保持与主服务器数据的一致性。
主从复制的优点包括:
-
数据备份:从服务器可以用于备份主服务器的数据,以便在主服务器出现故障或数据丢失时进行恢复。
-
高可用性:在主服务器故障或维护期间,从服务器可以接管服务,确保系统的可用性。
-
负载均衡:可以将读操作分布到多个从服务器上,从而减轻主服务器的负载,提高系统的性能和吞吐量。
-
分布式数据:可以将数据分布到多个地理位置或数据中心,以实现数据的分布式存储和访问。
高性能和高并发
Q:mysql 高并发环境解决方案是什么?
-
优化SQL语句:通过优化SQL语句的查询方式,减少数据库的访问次数和查询时间,从而提高查询性能。例如,使用索引、避免全表扫描、减少子查询等。
-
数据库分片:将数据按照一定规则分散到多个数据库中,从而减少单个数据库的负载压力,提高并发性能。
-
负载均衡:通过将请求分发到多个服务器上,平衡服务器的负载,提高系统的并发处理能力。
-
数据缓存:通过在应用程序中使用缓存技术,将经常访问的数据缓存到内存中,从而减少数据库的访问次数,提高并发性能。
-
数据库集群:通过将多个MySQL服务器组成一个集群,实现数据的分布式存储和访问,提高系统的可用性和并发性能。
-
分布式事务:通过使用分布式事务技术,将事务分散到多个数据库中处理,从而提高系统的并发性能和可扩展性。
Q:使用什么工具可以分析SQL语句的性能消耗?
-
MySQL自带的性能分析工具:如EXPLAIN、SHOW PROFILE、SHOW STATUS、Performance Schema等。这些工具可以帮助开发者识别SQL语句的性能瓶颈,优化查询语句。
-
MySQL Workbench:MySQL Workbench是一款开源的MySQL数据库管理工具,
-
pt-query-digest:pt-query-digest是Percona Toolkit中的一个工具,可以将MySQL的慢查询日志分析成易于阅读的格式,并生成执行计划和性能报告。
-
Navicat Premium:Navicat Premium是一款功能强大的MySQL数据库管理工具,其中包含一个SQL Profiler工具,可以分析SQL语句的性能消耗,并提供可视化的执行计划和性能报告。
-
VividCortex:VividCortex是一款云端的MySQL性能监控工具。
Q:如何追踪对SQL进行追踪?
-
慢查询日志:MySQL提供了慢查询日志功能,可以记录执行时间超过一定阈值的SQL语句。
-
Performance Schema:MySQL的Performance Schema功能可以追踪MySQL服务器的性能指标和事件,包括SQL语句的执行情况和性能瓶颈等。通过Performance Schema,可以了解SQL语句在MySQL服务器中的执行情况和瓶颈,以便进行优化。
-
软件监控工具:可以使用一些软件监控工具,如Nagios、Zabbix等,对MySQL进行监控和追踪。这些工具可以对MySQL服务器的CPU、内存、磁盘等指标进行实时监控,并生成性能报告,以便分析SQL语句的执行情况和性能瓶颈。
-
第三方工具:还可以使用一些第三方工具,如pt-query-digest、VividCortex等,对SQL语句进行追踪和分析。这些工具可以生成执行计划、性能报告和优化建议等,帮助开发者了解SQL语句的执行情况和性能瓶颈,并进行优化。
Q:如何定位效率较低SQL语句?
-
使用慢查询日志:MySQL提供了慢查询日志功能,可以记录执行时间超过一定阈值的SQL语句。通过分析慢查询日志,可以找出执行时间较长、消耗资源较多的SQL语句,并对其进行优化。
-
使用性能分析工具:MySQL提供了多种性能分析工具,如EXPLAIN、SHOW PROFILE、Performance Schema等。通过这些工具可以了解SQL语句的执行计划、资源消耗情况和性能瓶颈等,以便进行优化。
Q:如何对MYSQL进行大表优化?
-
索引优化:对于大表中常用的查询语句,可以通过添加合适的索引来提高查询效率。
-
分区表:对于大表中数据量较大的部分,可以考虑将其拆分成多个分区表,以便提高查询效率。
-
数据库优化:对于大表的整体优化,可以采用MySQL的一些优化技巧,如调整缓存大小、优化查询语句、优化服务器参数等,以提高系统的整体性能和稳定性。
-
数据归档:对于大表中的历史数据,可以采用归档的方式进行处理,将不常用的数据移动到其他存储介质中,以减少大表的数据量和提高查询效率。
-
数据分离:对于大表中的读写分离的情况,可以采用主从复制的方式进行处理,将读操作分配到从服务器中进行处理,以减少主服务器的负荷和提高系统的整体性能。