【MySQL面试】Java工程师面试必备的MySQL题目

本文章所有题目参考自网络,每道题目我都在参考答案的基础上做了重新整理和总结!并在我个人认为相对比较重要的、面试几率大的题目前面使用(★)进行了标注。

★1、一张表,里面有ID自增主键,当insert了5条记录之后,删除了第4,5条记录,再把MySQL重启,再insert一条记录,这条记录的ID是6还是4 ?

  • 如果表的类型(存储引擎)是MyISAM,那么是6。
    因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
  • 如果表的类型(存储引擎)是InnoDB,那么是4。
    InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。
DROP TABLE IF EXISTS tab2;
DROP TABLE IF EXISTS tab1;

CREATE TABLE tab1(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
uname VARCHAR(20) NOT NULL
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

CREATE TABLE tab2(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
uname VARCHAR(20) NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO tab1 VALUES(null, "111");
INSERT INTO tab1 VALUES(null, "222");
INSERT INTO tab1 VALUES(null, "333");
INSERT INTO tab1 VALUES(null, "444");
INSERT INTO tab1 VALUES(null, "555");

INSERT INTO tab2 VALUES(null, "111");
INSERT INTO tab2 VALUES(null, "222");
INSERT INTO tab2 VALUES(null, "333");
INSERT INTO tab2 VALUES(null, "444");
INSERT INTO tab2 VALUES(null, "555");

DELETE FROM tab1 WHERE id IN (4, 5);
DELETE FROM tab2 WHERE id IN (4, 5);

# 重启MySQL服务
# net stop mysql
# net start mysql
-- C:\WINDOWS\system32>net stop mysql
-- MySQL 服务正在停止..
-- MySQL 服务已成功停止。
-- 
-- 
-- C:\WINDOWS\system32>net start mysql
-- MySQL 服务正在启动 .
-- MySQL 服务已经启动成功。

USE atguigudb;
INSERT INTO tab1 VALUES(null, "666");
INSERT INTO tab2 VALUES(null, "666");

 

2、MySQL服务器默认端口是什么?

Mysql服务器的默认端口是3306。

 

★3、与Oracle相比,MySQL有什么优势?

  • MySQL有社区版本,随时可用,无需付费。
  • 体积小、速度快、总体拥有成本低。
  • 支持多种操作系统。
  • MySQL是开源数据库,提供的接口支持多种语言连接操作。
  • MySQL的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的MySql能很容易充分利用CPU。
  • MySQL同时提供高度多样性,能够提供很多不同的使用者介面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言介面,例如C+,Perl,Java,PHP,以及Python。

★4、如何区分FLOAT和DOUBLE?

FLOAT浮点类型用于表示单精度浮点数值,单精度小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位。

DOUBLE浮点类型用于表示双精度浮点数值,双精度小数部分能精确到小数点后的15位,加上小数点前的一位 有效位数为16位。

以下是FLOAT和DOUBLE的区别

  1. 在内存中占有的字节数不同, 单精度内存占4个字节, 双精度内存占8个字节
  2. 有效数字位数不同(尾数) 单精度小数点后有效位数7位, 双精度小数点后有效位数16位
  3. 数值取值范围不同 根据IEEE标准来计算!
  4. 在程序中处理速度不同,一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

以下是FLOAT和DOUBLE的优缺点:

  • FLOAT单精度
    • 优点: FLOAT单精度在一些处理器上比DOUBLE双精度更快而且只占用DOUBLE双精度一半的空间
    • 缺点: 但是当值很大或很小的时候,它将变得不精确。
  • DOUBLE双精度

    优点: DOUBLE跟 FLOAT比较, 必然是 DOUBLE精度高,尾数可以有 16 位,而 FLOAT尾数精度只有 7 位

    缺点: DOUBLE双精度是消耗内存的,并且是 FLOAT单精度的两倍! ,DOUBLE的运算速度比 FLOAT慢得多, 因为DOUBLE尾数比FLOAT的尾数多, 所以计算起来必然是有开销的!

以下是FLOAT和DOUBLE的使用场景

首先,前提是能用单精度时不要用双精度以省内存,加快运算速度。

  • FLOAT: 当然你需要小数部分并且对精度的要求不高时,选择FLOAT单精度浮点型比较好!
  • DOUBLE: 因为小数位精度高的缘故,所以双精度用来进行高速数学计算、科学计算、卫星定位计算等处理器上双精度型实际上比单精度的快, 所以,当你需要保持多次反复迭代的计算精确性时,或在操作值很大的数字时,双精度型是最好的选择。

★5、如何区分CHAR_LENGTH和LENGTH函数?

MySQL中计算字符串长度有两个函数分别为CHAR_LENGTH和LENGTH。LENGTH()是按照字节来统计的,CHAR_LENGTH()是按照字符来统计的。CHAR_LENGTH是字符数,而LENGTH是字节数。Latin字符的这两个数据是相同的,但是对于Unicode和其他编码,它们是不同的。

CHAR_LENGTH

  • 1、返回值为字符串string或者对应字段长度,长度的单位为字符,一个多字节字符(例如,汉字)算作一个单字符;
  • 2、不管汉字还是数字或者是字母都算是一个字符;
  • 3、任何编码下,多字节字符都算是一个字符;

LENGTH

  • 1、返回值为字符串string或者对应字段长度,长度的单位为字节
  • 2、utf8字符集编码下,一个汉字是算三个字符,一个数字或字母算一个字符。
  • 3、其他编码下,一个汉字算两个字符, 一个数字或字母算一个字符。

★6、请简洁描述MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

  • Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
  • Read Committed(读取提交内容) >> 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
  • Repeatable Read(可重复读) >> 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。
  • Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(SERIALIZABLE) 不可能 不可能 不可能

 

★7、在MySQL中ENUM的用法是什么?

在MySQL中,ENUM是一个字符串对象,其值是从列创建时定义的允许值列表中选择的。也就是用于指定一组预定义的值,并可在创建表时使用。

ENUM数据类型提供以下优点:

  • 紧凑型数据存储,MySQL ENUM使用数字索引(1,2,3,…)来表示字符串值。
  • 可读查询和输出。

要定义ENUM列,请使用以下语法:

CREATE TABLE table_name (
    col ENUM ('value1','value2','value3')
);

Create table users(
    name ENUM('Smile','hello','YJS'
);

 

在非严格的SQL模式下,如果在ENUM列中插入无效值,MySQL将使用空字符串'',插入数字索引为0。 如果启用了严格的SQL模式,尝试插入无效的ENUM值将导致错误。

请注意,如果ENUM列定义为可空列,则可以接受NULL值。

8、如何定义REGEXP?

REGEXP是模式匹配,其中匹配模式在搜索值的任何位置。

正则表达式用来匹配文本的特殊的串(字符集合)也就是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。

LIKE 和 REGEXP之间的重要差别
LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE 将不会找到它,相应的行也不会被返回(除非使用通配符)。而 REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP 将会找到它,相应的行将被返回,并且 REGEXP 能匹配整个列值(与 LIKE 相同的作用)。

MySQL中使用正则表达式看这里:如何在Mysql中使用Regexp正则表达式 - MySQL数据库

★9、CHAR和VARCHAR的区别?

在MySQL中,varcharchar都是可以存储字符串的类型,并且,在设计数据表时,必须明确的指定长度!

varchar变长的,假设某字段设计为varchar(10),当存入的是"java"字符串时,实际存入4个字符,则实际占用也是4个字符的空间大小;

char定长的,假设某字段设计为char(10),当存入的是"java"字符串时,将要存入的4个字符比设计的char(10)中指定的数量要少,则会补充6个空格,以达到10个字符,则实际占用也是10个字符的空间大小;

所以,如果要存入的字符串的长度不固定,应该使用varchar类型,只有长度固定的情况下才使用char


在MySQL处理varchar类型时,默认情况下,还会使用额外的1个字节记录“实际存入的字符数量”,也就是说,将"java"存入到varchar(10)的字段中,MySQL还会使用额外的1个字节空间记下4这个数量值,后续,当读取这个值时,MySQL会先读取这个4,然后再开始获取字段中的数据;而char类型就不存在这个问题,因为使用char类型存储的字符串的长度一定是固定的(即使不固定,也会添加空格,使得该字段的所有字符串的长度都与字段的设计值保持一致)。

当然,在处理varchar类型时,由于默认情况下只使用1个字节记录“实际存入的字符数量”,所以,在这种情况下能够存入的字符数量最多是255个(1个字节能表示的最大正数),当需要存入更多数据时,MySQL会自动扩容,使用2个字节记录“实际存入的字符数量”,能够表示的最大正数就是65535,并且,不会再扩容,所以,使用varchar最多存储65535个字符!

所以,综合来看,其实varchar类型的数据将占用更多的存储空间(需要使用额外的字节作记录),同时,查询效率偏低,所以,虽然使用char能够存储的数据换成使用varchar也都能正常存储和使用,但是,在能够使用char的应用场景,应该优先使用char

char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度。
1). 当字符串长度小于255时,用额外的1个字节来记录长度
2). 当字符串长度大于255时,用额外的2个字节来记录长度
3). 使用varchar最多存储65535个字符

 

★10、MySQL中,列的字符串类型可以是什么?

数据库中的每个表都是由一个或多个列构成的。可以用 CREATE TABLE 语句创建一个表,创建表时要为每列指定一个类型。列的类型与数据类型相对应,但是比数据类型更为具体,用列类型描述表列可能包含的值的种类以及范围,列的值必须符合规定,不能包含对应的数据类型所允许的所有值。例如,CHAR(16)就规定了存储的字符串值必须是16位。当然不是你必须存储16个字符,而是指列在表中要占16个字符的宽度的。MySQL 的列类型是一种手段,通过这种手段可以描述一个表列包含什么类型的值,这又决定了 MySQL 怎样处理这些值。

MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。其中MySQL 提供的字符串类型包括 CHARVARCHARBLOBTEXTENUMSET。 对这些类型作一个简要的叙述如下:

类型名 含义 类型名 含义
CHAR 定长字符串 VARCHAR 变长字符串
TINYBLOB BLOB(2^8-1) TINYTEXT TEXT(2^8-1)
BLOB BLOB(2^16-1) TEXT TEXT(2^16-1)
MEDIUMBLOB BLOB(2^24-1) MEDIUMTEXT TEXT(2^24-1)
LONGBLOB BLOB(2^32-1) LONGTEXT TEXT(2^32-1)
ENUM('value1','value2',...) 枚举:列只能赋值为某个枚举成员或NULL SET('value1','value2',...) 集合:列可以赋值为多个集合成员或NULL

表格中,BLOB是一个能保存可变数量的数据的二进制的大对象。在某种意义上,串实际是一种非常“通用”类型,因为可用它们来表示任意值,不仅仅是字符串。例如,可用串类型来存储二进制数据,如图像、视频或音频。

11、如何获取当前的Mysql版本?

SELECT VERSION();用于获取当前Mysql的版本。

★12、超键、候选键以及主键有什么区别?

比如在一张表中,有id、user、pwd、section、name字段。

  • 超键

    在关系中能唯一标识元组的属性称为关系模式的超键。 定义中的“属性集”,超键可以是一个很大的集合,只要他能确定是哪一行就行,(id、user、pwd、section、name)、(id、user、pwd)都可以是超键的集。

  • 候选键

    不含有多余属性的超键,比如在上面的超键中,id自己就可以独自确定是哪一行,所以他自己可以是一个候选键,除去它以外的其他属性也可以是候选键,但是全部放在一起因为有了多余的列,他们就不是候选键。(另外四个可以是候选键的原因是每一列都有可能有重复的内容)

  • 主键

    在所有的候选键里面找一个作为主键供使用,也就是说可以是id,也可以是另外四个的合体,也有可能是其他的选择,只要能保证选择的集合能唯一确定即可。

总结来说,候选键是超键的子集,主键是候选键的子集。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

13、如何使用Unix shell登录MySQL?

我们可以通过以下命令登录:

[mysql dir]/bin/mysql -h hostname -u-p

 

14、 myisamchk是用来做什么的?

它用来压缩MyISAM表,这减少了磁盘或内存使用。

★15、MySQL数据库服务器性能分析的方法命令有哪些?

我们可以通过show命令查看MySQL状态及变量,找到系统的瓶颈:

Mysql> show status -- 显示状态信息(扩展 show status like ‘XXX’)

Mysql> show variables -- 显示系统变量(扩展 show variables like ‘XXX’)

Mysql> show innodb status --  显示InnoDB存储引擎的状态

Mysql> show processlist -- 查看当前SQL执行,包括执行状态、是否锁表等

Shell> mysqladmin variables -u username -p password -- 显示系统变量

Shell> mysqladmin extended-status -u username -p password -- 显示状态信息

 

我常用的主要有show status和show processlist。

 

★16、Heap 表是什么?如何控制HEAP表的最大尺寸?

Heap表,即使用MEMORY存储引擎的表,这种表的数据存储在内存中,由于硬件问题或者断电,数据容易丢失,所以只能从其他数据表中读取数据作为临时表或者只读缓存来使用。

使用场景:

涉及瞬态,非关键数据的操作,例如会话管理或缓存。当MySQL服务器停止或重新启动时,MEMORY表中的数据将丢失。

内存中存储可实现快速访问和低延迟的数据。数据量可以完全容纳在内存中,而不会导致操作系统换出虚拟内存页面。

特点如下:

  • 只读或者只读为主的数据访问模式。
  • BLOB 或 TEXT 字段是不允许的。
  • 只能使用比较运算符=,<,>,=>,= <。
  • HEAP 表不支持 AUTO_INCREMENT。
  • 索引不可为 NULL。

HEAP表的大小可通过称为max_heap_table_size的MySQL配置变量来控制。

17、MyISAM Static和MyISAM Dynamic有什么区别?

在MyISAM Static上的所有字段有固定宽度。动态MyISAM表将具有像TEXT,BLOB等字段,以适应不同长度的数据类型。

MyISAM Static在受损情况下更容易恢复。

18、federated表是什么?

federated表,允许访问位于其他服务器数据库上的表。

★19、如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将自动获取当前时间戳。

20、怎样才能找出最后一次插入时分配了哪个自动增量?

LAST_INSERT_ID将返回由Auto_increment分配的最后一个值,并且不需要指定表名称。

SELECT LAST_INSERT_ID();

 

21、你怎么看到为表格定义的所有索引

SHOW INDEX FROM <表名>;

 

★22、LIKE声明中的%和_是什么意思?

%对应于0个或更多字符,_只是LIKE语句中的一个字符。

  • UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
  • FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令

★23、如何在Unix和MySQL时间戳之间进行转换?

  • UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
  • FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令
SELECT UNIX_TIMESTAMP();  -- 1660527962

SELECT FROM_UNIXTIME(1660527962)  -- 2022-08-15 09:46:02
FROM DUAL;

 

24、列对比运算符是什么?

在SELECT语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符。

详细使用看这里:MySQL 运算符总结大全(附详细示例) (imyjs.cn)

25、我们如何得到受查询影响的行数?

行数可以通过以下代码获得:

SELECT COUNT(user_id)FROM users;

 

★26、MySQL查询是否区分大小写?

  • MySQL 在 Windows 环境下是大小写不敏感的
  • MySQL 在 Linux 环境下是大小写敏感的
    • 数据库名、表名、表的别名、变量名是严格区分大小写的
    • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
  • 推荐采用统一的书写规范:
    • 数据库名、表名、表别名、字段名、字段别名等都小写
    • SQL 关键字、函数名、绑定变量等都大写

 

★27、LIKE和REGEXP操作有什么区别?

LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE 将不会找到它,相应的行也不会被返回(除非使用通配符)。而 REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP 将会找到它,相应的行将被返回,并且 REGEXP 能匹配整个列值(与 LIKE 相同的作用)。

 

★28、BLOB和TEXT有什么区别?

一、主要差别

TEXT与BLOB的主要差别就是BLOB保存二进制数据,TEXT保存字符数据。目前几乎所有网站内容里的图片都不是以二进制存储在数据库的,而是把图片上传到服务器然后正文里使用标签引用,这样的网站内容就可以使用TEXT类型。而BLOB就可以把图片换算成二进制保存到数据库中。

二、类型区别

BLOB有4种类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

TEXT也有4种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些类型同BLOB类型一样,有相同的最大长度和存储需求。

三、字符集

BLOB列没有字符集,并且排序和比较基于列值字节的数值值TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较

四、大小写

在TEXT或BLOB列的存储或检索过程中,不存在大小写转换,都一样!

区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值不区分大小写。

五、严格模式

运行在非严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告。

六、其它

当保存或检索BLOB和TEXT列的值时不删除尾部空格。

对于BLOB和TEXT列的索引,必须指定索引前缀的长度。

BLOB和TEXT列不能有默认值。

29、mysql_fetch_array和mysql_fetch_object的区别是什么?

mysql_fetch_array函数将结果行作为关联数组或来自数据库的常规数组返回。

mysql_fetch_object函数从数据库返回结果行作为对象。

 

30、我们如何在mysql中运行批处理模式?

以下命令用于在批处理模式下运行:

mysql;
mysql mysql.out

 

★31、MyISAM表格将在哪里存储,并且还提供其存储格式?

每个MyISAM表格以三种格式存储在磁盘上:

  • .frm文件存储表定义
  • 数据文件具有.MYD(MYData)扩展名
  • 索引文件具有.MYI(MYIndex)扩展名

 

★32.、MySQL中有哪些不同的存储引擎?

MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。MySQL5.7支持的存储引擎有:InnoDB,MyISAM,Memory,Merge,Archive,Federate,CSV,BLACKHOLE等。可以使用SHOW ENGINES语句查看系统支持的引擎类型。

InnoDB存储引擎

InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB 作为默认的存储引擎,InnoDB 主要特性有:

  • 支持事务
  • 灾难恢复性好
  • 为处理巨大数据量的最大性能设计
  • 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取
  • 支持外键完整性约束。存储表中的数据时,每张表的存储都按逐渐顺序存放,如果没有显示在表定义时指定主键,InnoDB会
  • 为每一行生成一个6B的ROWID,并以此作为主键。
  • 被用在众多需要高性能的大型数据库站点上

MyISAM存储引擎

MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎。MyISAM 主要特性有:

  • 不支持事务
  • 使用表级锁,并发性差
  • 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
  • 可以配合锁,实现操作系统下的复制备份、迁移
  • 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
  • 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
  • 可以把数据文件和索引文件放在不同目录
  • 使用 MyISAM 引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm 文件存储表定义,数据文件的扩展名为 .MYD(MYData),索引文件的扩展名是 .MYI(MYIndex)。

MEMORY存储引擎

MEMORY 存储引擎将表中的数据存储在内存中,为查询和引用其他表数据提供快速访问。MEMORY 主要特性有:

  • 使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈
  • 只支持固定大小的行。Varchar类型的字段会存储为固定长度的Char类型,浪费空间
  • 不支持TEXT、BLOB字段。当有些查询需要使用到临时表(使用的也是MEMORY存储引擎)时,如果表中有TEXT、BLOB字段,
  • 那么会转换为基于磁盘的MyISAM表,严重降低性能
  • 由于内存资源成本昂贵,一般不建议设置过大的内存表,如果内存表满了,可通过清除数据或调整内存表参数来避免报错
  • 服务器重启后数据会丢失,复制维护时需要小心

★33、存储引擎的选择

不同存储引擎都有各自的特点,以适应不同的需求,如下表所示,为了做出选择,首先需要考虑每一个存储引擎提供了哪些不同的功能。

功能 InnoDB MyISAM Memory
存储限制 64TB 256TB RAM
支持事务 Yes No No
支持全文索引 No Yes No
支持树索引 Yes Yes Yes
支持哈希索引 No No Yes
支持数据缓存 Yes No N/A
支持外键 Yes No No

 

1、如果要提供提交、回滚和崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB 是个很好的选择。
2、如果数据表主要用来插入和查询记录,则 MyISAM 引擎能提供较高的处理效率。
3、如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以将数据保存在内存中的 Memory 引擎。MySQL 中使用该引擎作为临时表,存放查询的中间结果。
4、如果只有 INSERT 和 SELECT 操作,可以选择 Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 引擎非常适合存储归档数据,如记录日志信息可以使用 Archive 引擎。

34、ISAM是什么?

ISAM简称为索引顺序访问方法。它是由IBM开发的,用于在磁带等辅助存储系统上存储和检索数据。

35、InnoDB是什么?

lnnoDB是一个由Oracle公司开发的Innobase Oy事务安全存储引擎。

36、MySQL如何优化DISTINCT?

DISTINCT这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是DISTINCT只有用二重循环查询来解决,而这样对于一个数据量非常大的表来说,无疑是会直接影响到效率的。

另外在MySQL的优化中,有一条是:大量的排序操作影响系统性能,所以尽量减少排序操作。GROUP BY、ORDER BY、 ROLLUP、DISTINCT等都会产生排序。少用DISTINCT!

优化方法:

用EXISTS代替DISTINCT。EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。

低效率:
select distinct userid,username from user,userinfo where user.userid=userinfo.userid
高效率:
select userid,username from user where exists (select 'T' from userinfo where userinfo.userid=user.userid)

其中T的意思是:
因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段出来差,而某些情况下,select具体的字段出来性能可能比select 一个常量出来要差得多。

 

37、如何输入字符为十六进制数字?

如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。

如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。

38、如何显示前50行?

在Mysql中,使用以下代码查询显示前50行:

SELECT*
FROM <表名>
LIMIT 0,50;

 

★39、可以使用多少列创建索引?

任何标准表最多可以创建16个索引列。

 

★40、NOW()和CURRENT_DATE()有什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE()仅显示当前年份,月份和日期。

 

41、什么样的对象可以使用CREATE语句创建?

以下对象是使用CREATE语句创建的:

  • DATABASE
  • TABLE
  • VIEW
  • INDEX
  • FUNCTION
  • PROCEDURE
  • USER
  • TRIGGER
  • EVENT

★42、MySQL表中允许有多少个TRIGGERS?

在Mysql表中允许有六个触发器,如下:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE

 

43、什么是非标准字符串类型?

以下是非标准字符串类型:

  • TINYTEXT
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT

 

44、什么是通用SQL函数?

  • CONCAT(A, B) - 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。
  • FORMAT(X, D)- 格式化数字X到D有效数字。
  • CURRDATE(), CURRTIME()- 返回当前日期或时间。
  • NOW() - 将当前日期和时间作为一个值返回。
  • MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() - 从日期值中提取给定数据。
  • HOUR(),MINUTE(),SECOND() - 从时间值中提取给定数据。
  • DATEDIFF(A,B) - 确定两个日期之间的差异,通常用于计算年龄
  • SUBTIMES(A,B) - 确定两次之间的差异。
  • FROMDAYS(INT) - 将整数天数转换为日期值。

     

45、解释访问控制列表

ACL(访问控制列表)是与对象关联的权限列表。这个列表是Mysql服务器安全模型的基础,它有助于排除用户无法连接的问题。

MySQL将ACL(也称为授权表)缓存在内存中。当用户尝试认证或运行命令时,Mysql会按照预定的顺序检查ACL的认证信息和权限。

 

★46、MySQL支持事务吗?

MySQL是否支持事务要看用的是什么存储引擎。

在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。

但是如果你的MYSQL表类型是使用InnoDB Tables 的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式。
在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。

★47、 MySQL里记录货币用什么字段类型好?

在Java的开发中,货币在数据库中MySQL常用DecimalNumric类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;例如:

salary DECIMAL(9,2)

 

在这个例子中,9(precision)代表将被用于存储值的总的位数,而2(scale)代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。

DECIMALNUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果scale>0)和“-”符号(对于负值)。如果scale是0,DECIMAL和NUMERIC值不包含小数点或小数部分。

不使用float或者double的原因:因为float和double是以二进制存储的,所以有一定的误差。

48、MYSQL数据表在什么情况下容易损坏?

服务器突然断电导致数据文件损坏。

强制关机,没有先关闭mysql 服务等。

 

49、MySQL有关权限的表都有哪几个?

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在MySQL数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。

 

★50、MySQL中有哪几种锁?

  • MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁
  • 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低
  • 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

 

AI模拟面试

本文章中大部分题目已经收录到了我的AI模拟面试客户端软件中,关于这个软件看这里:使用Python开发一个AI模拟面试系统 (imyjs.cn)

微信关注

                    编程那点事儿

阅读剩余
THE END