MySQL 高频面试题
主键、外键、超键、候选键的区别?
解答
- 主键(Primary Key): 唯一标识数据库表中每一行的字段或字段组合,不能为空且每个表只能有一个主键。
- 外键(Foreign Key): 表中的字段或字段组合,它与另一个表的主键相对应,用于建立两个表之间的链接。
- 超键(Super Key): 包含候选键和主键的属性集,可以唯一标识关系中的元组。
- 候选键(Candidate Key): 不包含多余元素的最小超键,可以作为主键。
为什么使用自增列作为主键?
解答
使用自增列作为主键可以简化数据库内部数据管理,保持数据的连续性,提高插入效率,减少页分割和碎片化,同时也便于数据的索引和查询。
触发器的作用是什么?
解答
触发器是一种特殊的存储过程,通过事件来触发执行。它可以强化约束,维护数据的完整性和一致性,可以跟踪数据库内的操作,不允许未经许可的更新和变化,也可以实现级联操作。
什么是存储过程?用什么来调用?
解答
存储过程是一组为了执行某项功能而预编译的SQL语句。它们可以通过SQL命令或应用程序中的调用语句来执行,提高了数据操作的效率和安全性。
存储过程的优缺点有哪些?
解答
优点包括提高性能(预编译)、减少网络传输、增强安全性和代码重用。缺点主要是移植性较差,受限于特定的数据库系统。
存储过程与函数的区别是什么?
解答
存储过程和函数的主要区别在于使用场景、返回类型、执行方式和在SQL语句中的使用。存储过程用于完成特定操作,而函数用于返回特定数据;存储过程不需要返回类型,函数必须声明返回类型;存储过程可作为独立的PL/SQL执行,函数通常作为表达式的一部分。
什么叫视图?游标是什么?
解答
- 视图(View): 是一种虚拟的表,具有和物理表相同的功能,可以简化复杂的查询操作。
- 游标(Cursor): 是对查询出来的结果集进行有效处理的一种机制,允许逐行处理结果集。
视图的优缺点有哪些?
解答
优点包括简化查询、提高数据安全性和逻辑数据独立性。缺点主要是可能影响性能,尤其是在基于复杂查询或大数据量的视图上。
drop、truncate、delete的区别是什么?
解答
- drop: 直接删除表及其数据和结构,不可恢复。
- truncate: 删除表中所有数据,保留表结构,速度较快,不可恢复,不触发删除触发器。
- delete: 删除满足条件的数据行,可配合where子句使用,删除操作可回滚,触发删除触发器。
什么是临时表,临时表什么时候删除?
解答
临时表是在当前数据库会话或事务中使用的表,当关闭连接或事务结束时,MySQL会自动删除临时表并释放所有空间。
非关系型数据库和关系型数据库的区别及优势比较?
解答
关系型数据库依赖预定义的表结构和固定模式,支持复杂查询和事务;非关系型数据库(NoSQL)不需要预定义的表结构,支持大规模分布式存储,灵活的数据模型,适用于大数据应用。关系型数据库的优势在于复杂查询和事务支持,非关系型数据库的优势在于高性能、可扩展性和灵活的数据模型。
数据库范式是什么?根据某个场景设计数据表?
解答
数据库范式是指导数据库设计的一系列规范,用于确保数据库结构的合理性和数据的一致性。设计数据表时,应遵循第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等,以避免数据冗余和维护数据完整性。
内连接、外连接、交叉连接、笛卡尔积等的区别是什么?
解答
- 内连接(INNER JOIN): 只连接匹配的行。
- 外连接(OUTER JOIN): 左外连接包含左边表的全部行,右外连接包含右边表的全部行,全外连接包含两个表的全部行。
- 交叉连接(CROSS JOIN): 生成笛卡尔积,不使用任何匹配或选取条件,直接将一个数据源中的每个行与另一个数据源的每个行一一匹配。
- 笛卡尔积: 是两个表的行两两组合的结果集。
varchar和char的使用场景?
解答
- char: 适用于存储固定长度的数据,如密码哈希、固定格式的代码等。
- varchar: 适用于存储长度可变的数据,如用户输入的评论或描述。
SQL语言分类有哪些?
解答
SQL语言分为四大类:
- 数据查询语言(DQL): 如SELECT。
- 数据操纵语言(DML): 如INSERT、UPDATE、DELETE。
- 数据定义语言(DDL): 如CREATE、ALTER、DROP。
- 数据控制语言(DCL): 如GRANT、REVOKE。
like '%_' 和 '-' 的区别是什么?
解答
like '%_'
: 是SQL中的模糊匹配操作符,用于匹配任意单个字符。-
: 在SQL中通常用于数值计算中的减法操作。
count(*)、count(1)、count(column)的区别是什么?
解答
count(*)
: 对表中所有行进行计数,包含NULL。count(1)
: 与count(*)
功能相同,但可能在某些情况下性能更优。count(column)
: 对特定列的非NULL值进行计数。
最左前缀原则是什么?
解答
最左前缀原则是指在使用多列索引时,数据库查询优化器只会使用索引的最左部分,即从左到右的顺序,只有当前面的列满足条件时,才会使用后面的列作为索引。
什么是索引?
解答
数据库索引是数据库管理系统中一个排序的数据结构,用于提高数据检索速度。索引的实现通常使用B树及其变种B+树。
索引的作用及其优缺点是什么?
解答
索引的作用是协助快速查询、更新数据库表中数据。优点包括提高查询效率、保证数据唯一性、加速表连接和排序。缺点是增加了存储空间需求和数据维护成本,尤其是在插入、删除和修改数据时。
什么样的字段适合建索引?
解答
适合建索引的字段包括经常需要搜索的列、作为主键的列、常用于连接的列、经常需要根据范围进行搜索的列、经常需要排序的列以及经常使用在WHERE子句中的列。
MySQL B+Tree索引和Hash索引的区别是什么?
解答
- B+Tree索引: 适用于范围查询和排序,可以利用索引的有序性,适用于大量数据。
- Hash索引: 适用于等值查询,但不能使用范围查询和排序,因为Hash值的大小关系并不能保证和原始键值完全一样。
B树和B+树的区别是什么?
解答
- B树: 每个节点存储key和data,所有节点组成这棵树,叶节点指针为null,叶节点不包含任何关键字信息。
- B+树: 所有的叶子节点包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子节点本身依关键字的大小顺序链接。
为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据库索引?
解答
B+树相比于B树更适合实际应用,因为它的磁盘读写代价更低,查询效率更加稳定,并且所有的关键字查询路径长度相同,导致每一个数据的查询效率相当。
聚集索引和非聚集索引的区别是什么?
解答
聚集索引的表记录排列顺序和索引排列顺序一致,查询效率高,但修改慢。非聚集索引指定了表中记录的逻辑顺序,但记录的物理和索引不一定一致,适用于分组、大数据量的不同值、频繁更新的列中。
MySQL的行锁和表锁有什么区别?
解答
- 行锁:MySQL的InnoDB存储引擎支持行锁,它锁定数据行,允许其他事务对同一表的其他行进行并发访问和修改,提高了数据库的并发性能。
- 表锁:MyISAM存储引擎使用表锁,它锁定整个表,同一时间只允许一个事务对表进行读写操作,其他事务必须等待锁释放后才能访问该表。
MySQL的默认事务隔离级别是什么?
解答
MySQL的默认事务隔离级别是可重复读(Repeatable Read),该级别可以防止脏读和不可重复读,但可能会出现幻读。
Mysql数据库表类型有哪些?
解答
MySQL支持多种表类型,包括但不限于:
- MyISAM:不支持事务,不支持行级锁,读取速度快。
- InnoDB:支持事务,支持行级锁,支持外键约束。
- MEMORY:将所有数据存储在内存中,访问速度极快,但数据在数据库服务器重启时会丢失。
- ARCHIVE:用于存储大量未修改的数据,使用行级锁定,适合插入和选择操作。
MySQL怎么恢复半个月前的数据?
解答
恢复半个月前的数据通常涉及使用备份文件(如使用mysqldump命令创建的备份)和二进制日志文件(binlog)。通过恢复备份文件到指定时间点,然后应用自那以后的所有变更到数据库。
MySQL的内连接、左连接、右连接有什么区别?
解答
- 内连接(INNER JOIN):只返回两个表中匹配的行。
- 左连接(LEFT JOIN):返回左表中的所有行,即使右表中没有匹配的行,也会返回左表的数据,右表没有匹配的数据将为NULL。
- 右连接(RIGHT JOIN):与左连接相反,返回右表中的所有行,即使左表中没有匹配的行,也会返回右表的数据,左表没有匹配的数据将为NULL。
MySQL问题排查都有哪些手段?
解答
MySQL问题排查手段包括:
- 使用
EXPLAIN
查看查询的执行计划。 - 开启慢查询日志,分析慢查询的原因。
- 使用
SHOW PROCESSLIST
查看当前所有连接信息。 - 使用
SHOW ENGINE INNODB STATUS
查看InnoDB存储引擎的状态。 - 使用性能监控工具,如
mysqltuner
。
如何做MySQL的性能优化?
解答
MySQL性能优化的方法包括:
- 优化查询语句,使用合适的索引。
- 分析和调整数据库配置参数。
- 使用缓存技术,如Redis或Memcached。
- 实现读写分离和主从复制。
- 对大数据表进行分区。
- 定期维护数据库,如优化表(OPTIMIZE TABLE)。
MySQL由哪些部分组成,分别用来做什么?
解答
MySQL由以下主要部分组成:
- 连接器:管理客户端的连接和权限验证。
- 分析器:进行词法和语法分析。
- 优化器:生成执行计划,选择索引。
- 执行器:操作存储引擎,返回执行结果。
- 存储引擎:负责数据的存储和提供读写接口。
请你介绍一下mysql的主从复制?
解答
MySQL主从复制是一种数据复制机制,允许将一个MySQL服务器(主服务器)的数据自动复制到另一个或多个MySQL服务器(从服务器)。主服务器上的数据变更通过二进制日志记录,从服务器通过读取这些日志并应用变更来同步数据。
请你介绍一下mysql的MVCC机制
解答
MVCC(多版本并发控制)是MySQL中InnoDB存储引擎实现的一种机制,用于支持高并发事务处理。MVCC通过为每行数据保存两个隐藏的列(创建版本号和删除版本号)来实现,允许在不锁定资源的情况下读取数据。
常用的Mysql复制架构有哪些?
解答
常用的MySQL复制架构包括:
- 一主多从:适用于读多写少的场景,可以实现读写分离。
- 多级复制:可以减轻主服务器的I/O压力,适用于有多个从服务器的情况。
- 双主复制:两个MySQL服务器互为主从,可以提高数据的可用性和容错性。
Mysql的存储引擎,myisam和innodb的区别?
解答
- MyISAM:MySQL的默认存储引擎,不支持事务,支持表级锁定,适合读密集型应用。
- InnoDB:支持事务处理,支持行级锁定和外键约束,适合写密集型和需要事务支持的应用。
请问MySQL的端口号是多少,如何修改这个端口号?
解答
MySQL的默认端口号是3306。可以通过编辑MySQL的配置文件(通常是my.cnf
或my.ini
),在[mysqld]
部分添加或修改port
参数来更改端口号。
Mysql如何为表字段添加索引?
解答
可以使用ALTER TABLE
语句为表字段添加索引,例如:
ALTER TABLE table_name ADD INDEX index_name (column);
或者为多个列添加复合索引:
ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...);
说说自己对于MySQL常见的两种存储引擎:MyISAM与InnoDB的理解?
解答
MyISAM适合读密集型应用,不支持事务和行级锁定,写操作时会锁定整个表。InnoDB适合写密集型应用,支持事务、行级锁定和外键约束,提供了更高的数据完整性和并发性能。
如何验证MySQL的索引是否满足需求?
解答
可以通过执行计划(EXPLAIN)来分析查询语句,检查是否有效使用了索引。此外,可以通过慢查询日志来识别没有使用索引的查询,进一步优化索引策略。
请介绍一下mysql的主从复制?
解答
MySQL的主从复制允许数据从一个主服务器自动复制到一个或多个从服务器。主服务器的变更记录在二进制日志中,从服务器通过读取这些日志来更新自己的数据。这有助于提高数据的可用性和可扩展性。
请介绍一下mysql的MVCC机制
解答
MVCC(多版本并发控制)是InnoDB存储引擎中用于处理事务的一种机制。它允许在不锁定资源的情况下读取数据,通过为每行数据保存创建版本号和删除版本号来实现。
常用的Mysql复制架构有哪些?
解答
常用的MySQL复制架构包括一主多从、多级复制和双主复制。一主多从适用于读写分离,多级复制可以减轻主服务器的I/O压力,双主复制提供了更高的数据可用性。
InnoDB支持事务,MyISAM不支持。请对比它们的其他主要差异?
解答
除了事务支持外,InnoDB支持行级锁和外键约束,而MyISAM只支持表级锁。InnoDB不保存表的行数,进行SELECT COUNT(*)
时需要全表扫描;MyISAM保存了行数,可以直接读取。InnoDB支持MVCC,而MyISAM不支持。
MySQL的端口号是多少,如何修改这个端口号?
解答
MySQL的默认端口号是3306。可以通过编辑MySQL的配置文件(如my.cnf
或my.conf
),在[mysqld]
部分设置port
参数来修改端口号。
Mysql如何为表字段添加索引?
解答
可以使用ALTER TABLE
语句为表字段添加索引,例如:
ALTER TABLE table_name ADD INDEX index_name (column);
也可以为多个列添加复合索引。
说说自己对于MySQL常见的两种存储引擎:MyISAM与InnoDB的理解?
解答
MyISAM适合读密集型应用,不支持事务和行级锁定,写操作时会锁定整个表。InnoDB适合写密集型应用,支持事务、行级锁定和外键约束,提供了更高的数据完整性和并发性能。
聚集索引和非聚集索引的区别?
解答
聚集索引的表记录排列顺序和索引排列顺序一致,查询效率高,但修改慢。非聚集索引指定了表中记录的逻辑顺序,但物理和索引不一定一致,适用于分组、大数据量的不同值、频繁更新的列中。
请描述一下MySQL中B树和B+树的区别?
解答
B树每个节点存储key和data,所有节点组成树,叶节点不包含任何关键字信息。B+树的叶子节点包含了全部关键字信息,及指向含有这些关键字记录的指针,且叶子节点本身依关键字的从小到大的顺序链接。
为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据库索引?
解答
B+树的磁盘读写代价更低,查询效率更稳定。B+树的内部节点较小,可以减少IO读写次数。所有关键字查询的路径长度相同,保证了查询效率的一致性。
请描述一下MySQL中的聚集索引和非聚集索引的区别?
解答
聚集索引的表记录的排列顺序和索引的排列顺序一致,物理上也连续存放。非聚集索引指定了表中记录的逻辑顺序,但记录的物理和索引不一定一致,非聚集索引的叶子层包含一个指向表中的记录在数据页中的指针。
请介绍一下MySQL中的函数分类和常用函数?
解答
MySQL中的函数可以分为字符串函数、数值函数、日期时间函数和聚合函数等。常用函数包括但不限于CONCAT()
, SUBSTRING()
, DATE_FORMAT()
, COUNT()
, SUM()
, AVG()
等。
分组查询需要注意哪些条件?
解答
分组查询时需要注意以下几点:
- 使用
GROUP BY
子句对结果进行分组。 - 可以使用聚合函数(如
COUNT()
,SUM()
,AVG()
等)对每个分组进行计算。 SELECT
列表中的非聚合列必须在GROUP BY
子句中明确指定。
limit使用方法?
解答
LIMIT
用于限制查询结果的数量。基本语法为:
SELECT column_name(s)
FROM table_name
LIMIT offset, count;
其中,offset
是指定要跳过的行数,count
是要返回的行数。
MySQL常见数据类型有哪些?
解答
MySQL常见的数据类型包括:
- 整数类型:
TINYINT
,SMALLINT
,MEDIUMINT
,INT
,BIGINT
- 浮点数类型:
FLOAT
,DOUBLE
- 字符串类型:
CHAR
,VARCHAR
,TEXT
- 日期时间类型:
DATE
,TIME
,DATETIME
,TIMESTAMP
- 二进制类型:
BINARY
,VARBINARY
,BLOB
如何增加删除修改表结构?
解答
可以使用ALTER TABLE
语句来增加、删除或修改表结构。例如:
- 添加字段:
ALTER TABLE table_name ADD column_name datatype;
- 删除字段:
ALTER TABLE table_name DROP column_name;
- 修改字段:
ALTER TABLE table_name MODIFY column_name datatype;
检测端口是否运行的方法有哪些?
解答
可以使用以下命令检测端口是否运行:
lsof -i:port_number
netstat -tunlp|grep port_number
ss -tulnp|grep port_number
如何为MySQL设置密码或者修改密码?
解答
可以通过以下方法为MySQL设置或修改密码:
- 使用
mysqladmin
命令:mysqladmin -u root -p password 'new_password'
- 使用SQL语句:
UPDATE mysql.user SET password=PASSWORD('new_password') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;
- 在MySQL命令行中使用
ALTER USER
命令:ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
如何登陆MySQL数据库?
解答
可以使用mysql
命令行工具登录MySQL数据库:
mysql -u username -p
输入密码后即可登录。如果是多实例MySQL,可以使用指定的socket文件:
mysql -u username -p -S /path/to/socket/file
查看当前数据库的字符集
解答
可以在MySQL命令行中使用以下命令查看当前数据库的字符集:
SHOW VARIABLES LIKE 'character_set%';
如何查看当前数据库版本?
解答
可以使用以下命令查看MySQL数据库的版本:
mysql -V
或者在MySQL命令行中使用:
SELECT VERSION();
如何查看当前登录的用户?
解答
在MySQL命令行中使用以下命令查看当前登录的用户:
SELECT CURRENT_USER();
查看T1数据库中有哪些表
解答
在MySQL命令行中使用以下命令查看特定数据库(如T1)中的所有表:
USE T1;
SHOW TABLES;
创建GBK字符集的数据库oldboy,并查看已建库完整语句
解答
可以使用以下命令创建使用GBK字符集的数据库,并查看创建数据库的完整SQL语句:
CREATE DATABASE oldboy DEFAULT CHARACTER SET gbk;
SHOW CREATE DATABASE oldboy;
创建用户oldboy,使之可以管理数据库oldboy
解答
可以使用以下命令创建用户并授予管理特定数据库的权限:
CREATE USER 'oldboy'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON oldboy.* TO 'oldboy'@'localhost';
查看创建的用户oldboy拥有哪些权限
解答
可以使用以下命令查看用户oldboy的权限:
SHOW GRANTS FOR oldboy@'localhost';
查看当前数据库里有哪些用户
解答
可以使用以下命令查看当前MySQL服务器中所有用户:
SELECT User, Host FROM mysql.user;
如何进入oldboy数据库
解答
在MySQL命令行中使用以下命令进入oldboy