【BAT面试必备】备战大厂,MySQL我是这么准备的!(附答案)

写在前面:

系列文章本着由简入繁的原则,持续更新,有好的面试题的伙伴们也可以私信博主,我们共同努力!当然了,文章中有什么不合适的地方也请大家指正!

 

(答案在后面,建议先看题目,再看答案!!!)

题目

  1. 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?
  2. Heap 表是什么?
  3. 区分CHAR_LENGTH和LENGTH?
  4. 请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
  5. 在MySQL中ENUM的用法是什么?
  6. 如何定义REGEXP?
  7. 列的字符串类型是什么?
  8. MySQL中使用什么存储引擎?
  9. MySQL驱动程序是什么?
  10. TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?
  11. 主键和候选键有什么不同?
  12. 如何使用unix shell登录MySQL
  13. myisamchk是用来做什么的?
  14. MySQL数据库服务器性能分析的方法命令有哪些?
  15. 如何控制heap表的大小?
  16. LIKE 和 REGEXP 操作有什么区别?
  17. MyISAM static和MyISAM Dynamic有什么区别?
  18. federated表是什么?
  19. 如果一个表有一列定义为 TIMESTAMP,将发生什么?
  20. 列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?
  21. 怎么才能找到最后一次插入时分配了哪个自动增量?
  22. BLOG和TEXT有什么区别?
  23. mysql_fetch_array 和 mysql_fetch_object 的区别是什么?
  24. 我们如何在 mysql 中运行批处理模式?
  25. MyISAM 表格将在哪里存储,并且还提供其存储格式?
  26. MySQL中有哪些表格?
  27. MySQL 数据优化
  28. MySQL 的关键字
  29. 存储引擎
  30. ISAM 是什么?
  31. Mysql 如何优化 DISTINCT?
  32. 如何输入字符为十六进制数字?
  33. 可以使用多少列创建索引?
  34. NOW()和 CURRENT_DATE()有什么区别?
  35. 什么样的对象可以使用 CREATE 语句创建?
  36. Mysql 表中允许有多少个 TRIGGERS?
  37. 什么是非标准字符串类型?
  38. 什么是通用 SQL 函数?
  39. 解释访问控制列表
  40. MYSQL 支持事务吗?
  41. mysql 里记录货币用什么字段类型好
  42. mysql 有关权限的表都有哪几个?
  43. Mysql 中有哪几种锁?
  44. 数据库备份
 

答案

一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?

(1)如果表的类型是 MyISAM,那么是 18

因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 MySQL 自增主键的最大 ID 也不会丢失 ;

2)如果表的类型是 InnoDB,那么是 15

InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据库或者是对表进行 OPTIMIZE 操作,都会导致最大 ID 丢失

Heap 表是什么?

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

使用场景:

涉及瞬态,非关键数据的操作,例如会话管理或缓存。当MySQL服务器停止或重新启动时,MEMORY表中的数据将丢失。内存中存储可实现快速访问和低延迟的数据。数据量可以完全容纳在内存中,而不会导致操作系统换出虚拟内存页面。

只读或者只读为主的数据访问模式。

BLOB 或 TEXT 字段是不允许的。

只能使用比较运算符=,<,>,=>,= <。

HEAP 表不支持 AUTO_INCREMENT。

索引不可为 NULL。

区分CHAR_LENGTH和LENGTH

CHAR_LENGTH 是字符数,而 LENGTH 是字节数。Latin 字符的这两个数据是相同的,但是对

 Unicode 和其他编码,它们是不同的。

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

SQL 标准定义的四个隔离级别为:

read uncommited :读到未提交数据

read committed:脏读,不可重复读

repeatable read:可重读

serializable :串行事物

在MySQL中ENUM的用法是什么?

ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。

Create table size(name ENUM('Smail,'Medium','Large');

如何定义REGEXP?

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

列的字符串类型是什么?

字符串类型是:

SET

BLOB

ENUM

CHAR

TEXT

VARCHAR

MySQL中使用什么存储引擎?

存储引擎称为表类型,数据使用各种技术存储在文件中。

技术涉及:

Storage mechanism

Locking levels

Indexing

Capabilities and functions.

MySQL驱动程序是什么?

以下是 Mysql 中可用的驱动程序:

PHP 驱动程序

JDBC 驱动程序

ODBC 驱动程序

CWRAPPER

PYTHON 驱动程序

PERL 驱动程序

RUBY 驱动程序

CAP11PHP 驱动程序

Ado.net5.mxj

TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?

创建表时 TIMESTAMP 列用 Zero 更新。只要表中的其他字段发生更改,UPDATE

CURRENT_TIMESTAMP 修饰符就将时间戳字段更新为当前时间。

主键和候选键有什么不同?

表格的每一行都由主键唯一标识,一个表只有一个主键。

主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

如何使用unix shell登录MySQL

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

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

myisamchk是用来做什么的?

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

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

  • Show status, 一些值得监控的变量值:

  1. Bytes_received和Bytes_sent 和服务器之间来往的流量。

  2. Com_*服务器正在执行的命令。

  3. Created_*在查询执行期限间创建的临时表和文件。

  4. Handler_*存储引擎操作。

  5. Select_*不同类型的联接执行计划。

  6. Sort_*几种排序信息。

  • Show profiles 是MySql用来分析当前会话SQL语句执行的资源消耗情况

如何控制heap表的大小?

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

LIKE 和 REGEXP 操作有什么区别?

LIKE 和 REGEXP 运算符用于表示 ^ 和%。

SELECT * FROM <tablename> WHERE * REGEXP "^b";

SELECT * FROM <tablename> WHERE * LIKE "%b";

MyISAM static和MyISAM Dynamic有什么区别?

 MyISAM Static 上的所有字段有固定宽度。

动态 MyISAM 表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。

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

federated表是什么?

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

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

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

列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?

它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

怎么才能找到最后一次插入时分配了哪个自动增量?

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

BLOG和TEXT有什么区别?

BLOB 是一个二进制对象,可以容纳可变数量的数据。有四种类型的 BLOB -

  • TINYBLOB

  • BLOB

  • MEDIUMBLOB 

  • LONGBLOB

        它们只能在所能容纳价值的最大长度上有所不同。

TEXT 是一个不区分大小写的 BLOB。四种 TEXT 类型

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT 

  • LONGTEXT

它们对应于四种 BLOB 类型,并具有相同的最大长度和存储要求。BLOB  TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT值不区分大小写。

mysql_fetch_array 和 mysql_fetch_object 的区别是什么?

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

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

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

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

mysql;

mysql mysql.out

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

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

·“.frm”文件存储表定义

·数据文件具有“.MYD”(MYData)扩展名

索引文件具有“.MYI”(MYIndex)扩展名

MySQL中有哪些表格?

共有 5 种类型的表格:

MyISAM

Heap

Merge

INNODB

ISAM

MySQL 数据优化

优化数据类型

避免使用 NULL,NULL 需要特殊处理, 大多数时候应该使用 NOTNULL,或者使用一个特殊的值,如 0,-1 作为默认值。

仅可能使用更小的字段,MySQL 从磁盘读取数据后是存储到内存中的,然后使用 cpu 周期和磁盘 I/O 读取它,这意味着越小的数据类型占用的空间越小.

小心字符集转换

        客户端或应用程序使用的字符集可能和表本身的字符集不一样,这需要MySQL 在运行过程中  隐含地进行转换,此外,要确定字符集如 UTF-8 是否支持多字节字符,因此它们需要更多的存储空间。

优化 count(mycol) 和 count()*

优化子查询

遇到子查询时,MySQL 查询优化引擎并不是总是最有效的,这就是为什么经常将子查询转换为连接查询的原因了,优化器已经能够正确处理连接查询了,当然要注意的一点是,确保连接表 (第二个表) 的连接列是有索引的,在第一个表上 MySQL 通常会相对于第二个表的查询子集进行一次全表扫描,这是嵌套循环算法的一部分。

优化 UNION

  • 在跨多个不同的数据库时使用 UNION 是一个有趣的优化方法,UNION 从两个互不关联的表中返回数据,这就意味着不会出现重复的行,同时也必须对数据进行排序,我们知道排序是非常耗费资源的,特别是对大表的排序。
  • UNION ALL 可以大大加快速度,如果你已经知道你的数据不会包括重复行,或者你不在乎是否会出现重复的行,在这两种情况下使用UNION ALL 更适合。此外,还可以在应用程序逻辑中采用某些方法避免出现重复的行,这样 UNION ALL 和 UNION 返回的结果都是一样的,但 UNION ALL 不会进行排序。

MySQL 的关键字

添加索引:

alter table tableName add 索引(索引字段)

主键:primary key

唯一:unique

全局:fulltext

普通:index

多列: index index_name

页级: 引擎 BDB。次锁定相邻的一组记录。

表级: 引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行。 行级: 引擎

INNODB , 单独的一行记录加锁,对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。 表级锁速度快,但冲突多,行级冲突少,但速度

存储引擎

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

MyISAM:这种引擎是 mysql 最早提供的。这种引擎又可以分为静态MyISAM、动态 MyISAM 和压缩 MyISAM 三种:

  1. 静态 MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。

  2. 动态 MyISAM:如果数据表中出现 varchar、text 或 BLOB 字段时,服务器将自动选择这种表类型。相对于静态 MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。

  3. 压缩 MyISAM:以上说到的两种类型的表都可以用 myisamchk 工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。

但是,不管是何种 MyISAM 表,目前它都不支持事务,行级锁和外键约束的功能。

MyISAM Merge 引擎:这种类型是 MyISAM 类型的一种变种。合并表是将几个相同的 MyISAM 表合并为一个虚表。常应用于日志和数据仓库。

InnoDB:InnoDB 表类型可以看作是对 MyISAM 的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。

memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。

archive:这种类型只支持 select 和 insert 语句,而且不支持索引。

Desc[ribe] tablename:查看数据表的结构。

show engines:命令可以显示当前数据库支持的存储引擎情况

ISAM 是什么?

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

Mysql 如何优化 DISTINCT?

DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。

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

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

只用(Ox)前缀输入十六进制数字。

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

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

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

NOW()和 CURRENT_DATE()有什么区别?

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

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

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

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

  • DATABASE

  • EVENT

  • FUNCTION

  • INDEXPROCEDURE

  • TABLE

  • TRIGGER

  • USER

  • VIEW

Mysql 表中允许有多少个 TRIGGERS?

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

  • BEFORE INSERT

  • AFTER INSERT

  • BEFORE UPDATE

  • AFTER UPDATE

  • BEFORE DELETE

  • AFTER DELETE

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

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

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

什么是通用 SQL 函数?

数学函数

  • Abs(num)求绝对值

  • floor(num)向下取整

  • ceil(num)向上取整

字符串函数

  • insert (s1,index,length,s2) 替换函数

S1 表示被替换的字符串

s2 表示将要替换的字符串

Index 表示被替换的位置, 从 1 开始

Lebgth 表示被替换的长度

  • upper(str),ucase(str)将字母改为大写

  • lower(str),lcase(str)将字母改为小写

  • left(str,length)返回 str 字符串的前 length 个字符

  • right(str,length)返回 str 字符串的后 length 个字符

  • substring(str,index,length)返回 str 字符串从 index 位开始长度为length 个字符(index 从 1 开始)

  • reverse(str)将 str 字符串倒序输出

日期函数

  • curdate()、current_date( ) 获取当前日期

  • curtime()、current_time( ) 获取当前日期

  • now()获取当前日期和时间

  • datediff(d1、d2)d1 和 d2 之间的天数差

  • adddate(date,num)返回 date 日期开始,之后 num 天的日期

  • subdate(date,num)返回 date 日期开始,之前 num 天的日期

聚合函数

  • Count(字段)根据某个字段统计总记录数(当前数据库保存到多少条数据)

  • sum(字段)计算某个字段的数值总和

  • avg(字段)计算某个字段的数值的平均值

  • Max(字段)、min(字段)求某个字段最大或最小值

解释访问控制列表

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

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

MYSQL 支持事务吗?

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

但是如果你的 MYSQL 表类型是使用 InnoDB Tables  BDB tables 的话,你的 MYSQL 就可以使用事务处理,使用 SET AUTOCOMMIT=0 就可以使 MYSQL 允许在非 autocommit 模式,在非

autocommit 模式下,你必须使用 COMMIT 来提交你的更改,或者用 ROLLBACK 来回滚你的更改。

示例如下:

START TRANSACTION;

SELECT @A:=SUM(salary) FROM table1 WHERE type=1;

UPDATE table2 SET summmary=@A WHERE type=1;

COMMIT;

mysql 里记录货币用什么字段类型好

NUMERIC  DECIMAL 类型被 Mysql 实现为同样的类型,这在 SQL92 标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些

类型之一时,精度和规模的能被(并且通常是)指定;

例如:

salary DECIMAL(9,2)

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

 ANSI/ISO SQL92 中,句法 DECIMAL(p)等价于 DECIMAL(p,0)

同样,句法 DECIMAL 等价于 DECIMAL(p,0),这里实现被允许决定值 pMysql 当前不支持DECIMAL/NUMERIC 数据类型的这些变种形式的任一种。这一般说来不是一个严重的问题,因为这些类型的主要益处得自于明显地控制精度和规模的能力。DECIMAL 和 NUMERIC 值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。

一个字符用于值的每一位、小数点(如果 scale>0)和“-”符号(对于负值)。如果 scale  0DECIMAL 和 NUMERIC 值不包含小数点或小数部分。

DECIMAL  NUMERIC 值得最大的范围与 DOUBLE 一样,但是对于一个给定的 DECIMAL NUMERIC 列,实际的范围可由制由给定列的 precision 或 scale 限制。

当这样的列赋给了小数点后面的位超过指定 scale 所允许的位的值,该值根据 scale 四舍五入。

当一个 DECIMAL  NUMERIC 列被赋给了其大小超过指定(或缺省的)precision  scale 隐含的范围的值,Mysql 存储表示那个范围的相应的端点值。

mysql 有关权限的表都有哪几个?

Mysql 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库里,由mysql_install_db 脚本初始化。

这些权限表分别 是user,db,table_priv,columns_priv 和host。

Mysql 中有哪几种锁?

MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量

最低

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

数据库备份

必须要在未登录状态下

导出整个数据库:

mysqldump -u 用户名 -p 数据库名 > 导出的文件名

导出一个表:

mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

导出一个数据库结构:

mysqldump -u dbuser -p -d --add-drop-table

dbname >d:/dbname_db.sql

-d 没有数据 --add-drop-table 在每个 create 语句之前增加一个 drop table

 
关于MySQL面试题,前面转载了一篇比较经典的,值得推荐!非常基础全面的总结:
 
 

 

posted @ 2021-06-03 15:47  傲骄鹿先生  阅读(338)  评论(0编辑  收藏  举报