目录
3.自增主键最大ID记录,MyISAM和InnoDB分别是如何存储的
18.关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
20.MySQL的binlog有有几种录入格式?分别有什么区别?
26.在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?
28.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
【写在前面】
此文题目和答案都非原创。
是搜集了网络上分享的关于Java面试常见问题汇总,然后又逐个搜寻了答案,整理于此。
供自学,感谢相关题目和答案的原创分享者。
1.解释MySQL外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一
个表的所有记录和另一个表中的所有记录一一匹配。
内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合
条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个
表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,
对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以
NULL 来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现
在结果集中。左连接和右连接可以互换,MySQL 目前还不支持全外连接。
2.Mysql如何优化DISTINCT?
DISTINCT 在所有列上转换为 GROUP BY,并与 ORDER BY 子句结合使用。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
3.自增主键最大ID记录,MyISAM和InnoDB分别是如何存储的
MyISAM表把自增主键的最大ID记录到数据文件里
InnoDB表把自增主键的最大ID记录到内存中
4.MySQL主从复制原理流程
参考文章:MySQL主从复制的实现过程
5.delete、truncate、drop区别
6.key和index的区别
参考文章:MySQL中键(key)和索引(index)的区别
7.MySQL优化
参考文章:MySQL优化十大技巧
8.行级锁定的缺点
9.行级锁定的优点
10.在MVCC并发控制中,读操作可以分成哪几类?
快照读 (snapshot read):读取的是记录的可⻅版本 (有可能是历史版本),不⽤加锁(共享读锁s锁也不加,所以不会阻塞其他事 务的写)。
当前读 (current read):读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条 记录。
11.MVVC了解过吗
参考文章:mysql mvvc 简单理解
12.表分区有什么好处?
参考文章:表分区的优缺点
13.表分区与分表的区别
14.什么是表分区?
参考文章:什么是表分区
15.什么情况下应不建或少建索引
表记录太少
经常插入、删除、修改的表
数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
经常和主字段一块查询但主字段索引值比较多的表字段
16.说一说三个范式
参考文章:说一说数据库三大范式
17.什么是存储过程?有哪些优缺点?
参考文章:什么是存储过程?有哪些优缺点
18.关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
参考文章:关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过
19.超大分页怎么处理?
参考文章:Mysql超大分页优化处理
20.MySQL的binlog有有几种录入格式?分别有什么区别?
参考文章:MySQL的binlog有有几种录入格式?分别有什么区别
21.varchar(10)和int(10)代表什么含义?
参考文章:mysql中int(10)和char(10),varchar(10)区别是什么
22.如果要存储用户的密码散列,应该使用什么字段进行存储?
密码散列,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储, 这样可以节省空间且提高检索效率.
23.字段为什么要求定义为not null?
not null 表示这个字段不能为空。虽然看起来他是人为设置的,但是他和业务逻辑或者数据结构有关系。比如你要对这条记录进行读取,而这个是很重要的属性,那么你不仅要让其不为空,还要让他是指定的格式或者数值。还有情况就是这个字段恰是其他表的主键,那么只有他有值才能正确关联两张表,所以它必须有值。
24.主键使用自增ID还是UUID?
参考文章:数据库主键到底是用自增长(INT)好还是UUID好?
25.为什么要尽量设定一个主键?
主键是数据库确保数据行在整张表唯一性的保障, 即使业务上本张表没有主键, 也建议添加一个自增长的ID列作为主键。设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全。
26.在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?
使用不等于查询。
列参与了数学运算或者函数。
在字符串like时左边是通配符.类似于'%aaa'。
当mysql分析全表扫描比使用索引快的时候不使用索引。
当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引。
27.MySQL有哪些日志,分别是什么用处?
参考文章:MySQL中的三种日志的特点和作用介绍
28.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
(1)区别
1)定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。
2)存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。。
(2)varchar(50)中50的涵义:表示最多存放50个字符。
varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。
补充:
(3)int(20)中20的涵义:指显示字符的长度,不影响内部存储,只是影响带 zerofill 定义的 int 时,前面补多少个 0,易于报表展示。mysql为什么这么设计?对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样。
29.MySQL的redo日志的刷盘时机
log buffer空间不足时
事务提交时
后台线程不停的刷刷刷
正常关闭服务器时
做所谓的checkpoint时
30.MySQL的redo日志和undo日志分别有什么用?
(1)redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
(2)undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
31.为什么InnoDB一定会生成主键?
innodb引擎的表底层存储数据时候, 必须按照B+树底层组成的聚簇索引这个方式存储, 所以必须有一个索引才能够串起来。但是有时候并没有创建主键, innodb引擎的表也能够正常创建, 这个是因为什么呢?没有主键的innodb引擎的表底层是如何存储的呢?
解释:
innodb存储引擎他是如果你没有创建索引,他会自动帮你找一列数据,这列数据没有重复的,把这个当成索引,然后在这个里面进行存储。
但是万一这个表找不到这个字段,他会自动帮你在底层创建一个隐藏的主键,这个就是int类型,通过这个隐藏键将这个数据按照B+树方式进行存储。
所以在建表时候自己能把主键建了就建了,别老是让MySQL底层帮你创建,他这个innodb就是这么设计的。
所以innodb存储引擎的表自己创建一个主键,这样MySQL也能够节省损耗。
32.InnoDB如果没有设置主键的话,它内部会怎么处理?
InnoDB对聚簇索引处理如下:
如果定义了主键,那么InnoDB会使用主键作为聚簇索引。
如果没有定义主键,那么会使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引 - 如果既没有主键也找不到合适的非空索引,那么InnoDB会自动生成一个不可见的名为ROW_ID的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增
很明显,缺少主键的表,InnoDB会内置一列用于聚簇索引来组织数据。而没有建立主键的话就没法通过主键来进行索引,查询的时候都是全表扫描,小数据量没问题,大数据量就会出现性能问题。
33.InnoDB删除某条记录后,内部会怎么处理?
删除一条记录,数据原有的被废弃,记录头发生变化,主要是打上了删除标记。
即原有的数据 deleted_flag 变成 1,代表数据被删除。
但数据没有被清空,在新一行数据大小小于这一行时,可能会占用这一行。这样其实就是存储碎片,要想减少存储碎片,可以通过重建表来实现(例如对于高并发大数据量表,除了归档,还可以通过利用无锁算法Alter修改字段来重建表增加表性能)。
34.InnoDB主键索引跟非主键索引在数据存储上的差异
主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引 (clustered index)。
非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引 (secondary index)。
35.InnoDB的数据是怎么存储的?
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
36.MyIsam的数据是怎么存储的?
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
37.InnoDB有聚簇索引吗?MyIsam呢?
InnoDB有聚簇索引,主键索引就是聚簇索引。
MyIsam没有聚簇索引,因为他的索引和记录 行是分开存储的。
38.什么是聚簇索引?
参考文章:mysql聚簇索引详解
39.MySQL索引的类型
参考文章:MySQL索引类型
(1)普通索引
(2)唯一性索引
(3)全文索引
(4)单列索引
(5)多列索引
(6)空间索引
40.有了解过“回表”的概念吗?什么情况下会出现“回表”?
41.事务的隔离级别了解过吗?
参考文章:MySQL的四种事务隔离级别
42.说一下什么是事务的ACID属性
参考文章:MySQL中事务的ACID属性
43.了解过哪些存储引擎?各有什么优缺点?
44.在建立索引的时候,都有哪些需要考虑的因素呢?
创建索引的基本原则:
(1)以查询关键字为基础,表中的行随机排序。可创建索引。
(2)包含的列数相对比较少的表。可创建索引。
(3)表中的大多数查询都包含相对简单的where从句。可创建索引。
(4)对于经常以查询关键字为基础的表,并且该表中的行遵从均匀分布。可创建索引。
(5)缓存命中率低,并且不需要操作系统权限。
(6)小数据量的表不宜使用索引。
(7)频繁使用插入,修改,删除等DML操作的数据表不宜使用索引。
45.Hash索引和B+树索引有什么区别或者说优劣呢?
46.索引是个什么样的数据结构呢?
参考文章:mysql的索引是什么数据结构
mysql索引的数据结构是树,常用的存储引擎innodb采用的是B+Tree。
47.什么是索引?
(1)索引是一种将数据库中的单列或者多列的值进行排序的结构。即:索引是一种数据结构。
(2)一个索引是存储表中一个特定列的值数据结构。索引是在表的列上创建。关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。
(2)索引可以提高查询速度,降低服务器的负载,但也不是绝对的。
(3)索引会影响用户操作数据库的插入操作,因为向有索引的数据库中插入数据,数据库系统按照索引进行排序,消耗一定的资源。用户可以将索引删除后,插入数据,再重新创建索引。
(4)所有存储引擎对每个表至少支持16个索引。总索引长度至少为256个字节。
(5)索引有两种存储类型,包括B树索引和哈希索引。