【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的区别:
- 在内存中占有的字节数不同, 单精度内存占4个字节, 双精度内存占8个字节
- 有效数字位数不同(尾数) 单精度小数点后有效位数7位, 双精度小数点后有效位数16位
- 数值取值范围不同 根据IEEE标准来计算!
- 在程序中处理速度不同,一般来说,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中,varchar
和char
都是可以存储字符串的类型,并且,在设计数据表时,必须明确的指定长度!
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 提供的字符串类型包括 CHAR
、VARCHAR
、BLOB
、TEXT
、ENUM
和 SET
。 对这些类型作一个简要的叙述如下:
类型名 | 含义 | 类型名 | 含义 |
---|---|---|---|
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常用Decimal
和Numric
类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定;例如:
salary DECIMAL(9,2)
在这个例子中,9(precision)代表将被用于存储值的总的位数,而2(scale)代表将被用于存储小数点后的位数。因此,在这种情况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。
DECIMAL
和NUMERIC
值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(如果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)