mysql基础面试题

创建表
列名以及列的类型前后顺序
三种等号
<=>,=,:=
mysql中0是不是null
slq语句的执行顺序
别名的两种方法
关键字用途
order by
group by
desc/asc
having___条件筛选
几个重要的集合函数
sum.aVG.min.max.count
SQL 什么语言
什么是结构化
数据表结构存储

查询
笛卡尔集
第一个表的每一行都要匹配第二个表的每一行。
原因各个表直接没有连接条件

连接查询的两种语法

sql99的内连接和外连接的过程和作用

外查询的6中查询
什么是子查询
分页查询关键字
分页起始索引是0还是1

union关键字用来做什么

约束
默非曾为外主
约束创建以及位置
修改表时增加约束,注意列级约束和表级约束不同

创建数据库
删除数据库
创建表
删除表
删除库和表相同

增加行
删除行
delete from…where…

增加列
列的添加就是添加列级约束时modify改为add
删除列
列的删除也要drop,只是列的删除需要指定表alter
删除索引
drop

列中插入数据
两种插入方法

修改某表中的某列

表的操作
重命名表
rename table…to…
复制表
create table…like…;

查询系统变量

mysql变量
mysql变量分为哪两种
系统变量分为哪两种
什么是会话
自定义变量有哪两种
怎么定义用户变量
用户变量的作用域
局部变量的定义和作用域

mysql体系结构
4器加1

什么是事务
事务的两个性质
事务的开启,回滚和提交
事务的ACID
怎么实现ACID
原子型:利用undo log日志和rollback回调函数实现
持久性:redo log日志和buffer pool。
向buffer pool 写入数据也会向redolog写入数据,当从buffer pool 将数据写入磁盘时,刷除redlog中的数据,即使宕机buffer pool中的数据没有写入磁盘,redo log中的数据依然存在,开机后利用这个日志恢复数据。
数据库的数据直接写入磁盘吗?
隔离性:锁机制和MVCC保证隔离性。
一个事务修改数据时需要先获取锁,加锁,再修改数据,这期间其他事务因为不能获取锁而等待。MVCC解决事务并发的脏读,不可重复读,幻读等问题。
一致性:前面三个性质保证一致性。

事务并发会产生哪些问题?
怎么解决事务并发问题
MVCC是什么
有哪些
为己可行
为了自己可以行
各自的意义
可重复读利用行锁加上间隙锁解决事务并发三个问题
串行化利用共享锁解决事务并发三个问题
事务可以嵌套吗,mysql支持事务嵌套吗?

隔离级别的高低
mysql默认的隔离级别
MVCC和并发问题的x✓关系

存储引擎
存储引擎的作用
innodb和myisam是什么
区别:
1、锁
2、事务
3、外键
4、缓存
5、性能以及原因
怎么设置创建的表的存储引擎?
mysql默认的存储引擎是哪个
索引
什么是索引
索引的分类,创建
至少四种
聚集索引,非聚集索引,辅助索引
什么是innodb的回表
主键是什么
主键索引的作用
主键三个性质
创建索引

mysql索引的原理
mysql为什么使用B+树
1、红黑树是平衡二叉树,B+树是多叉树,遍历寻找更快,效率更高。
2、B树每一个结点既存储索引值也存储数据,而B+树非叶子结点只存储索引值,叶子结点才存储数据,所以B+树每个结点存储的索引值越多,查询范围更大,查询更快。
3,B+树叶子结点是双向指针连接起来的,可以进行范围查询,利用计算机预读原理当加载某一个结点数据时,附近结点是数据也可以被加载到内存。

explain
作用
查询优化
type字段是什么作用


什么是死锁
怎么办
innodb的行锁是怎么实现的
共享锁和排他锁
共享锁也叫读锁
排他锁也叫写锁

MYSQL的访问权限
如何在其他设备上访问另一个服务器的MYSQL
create user 用户名IP identified by 密码
创建的用户,没有很多的权限,比如创建数据库,需要把有权限的用户的权限赋值给这个这个权限。
显示出来的数据太乱怎么办———格式化\G

MYSQL SC通信获取数据的过程
客户端想要访问MYSQL服务器需要密码和用户名验证,这个验证在哪一层进行验证?
分析器=词法分析器了+语法分析
优化器:索引选择
执行器:执行命令,调用存储引擎的数据接口,传输数据

查看存储引擎的命令
和查看数据库的命令一样
怎么设置表的存储引擎

存储引擎的作用:
负责组织表中的数据,为server层提供读写数据的接口。
实现一个存储引擎需要考虑哪些问题。

MEMERY
内存+哈希表+不支持事务和行表
INNODB
硬盘+B+树+事务,行锁,数据缓存
innodb支持数据缓存是什么意思
MYISAN
硬盘B+树+不支持事务,行锁和缓存
MYSQL是属于关系型数据还是非关系型,为什么——表
SQLITE呢
oracle呢
redis呢——key-value

MYSQL为什么不使用红黑树作为组织数据的方式
1、只是二叉树,数据量大,IO次数多,性能低
什么是一次IO操作:就是一次从磁盘读取数据到内存的过程
B树的特点:
多路查找树,
左小右大,
一个结点可以存储多个值,可以有多个子结点,
叶子结点都在同一层
多大都(多)成
关系型数据库为什么用B树组织数据
1、数据存储在磁盘
2、磁盘中数据都是按照块的单位存储的
3、B树的每一个结点就是一个数据块的数据

B+树区别于B树的两个点
B+树叶子结点连起来不仅有利于计算机的预读原理的使用,更方便于全表扫码。
每一个结点的数据是以数组还是链表的形式存储起来的

创建一张表,MYSQL进行了哪些操作:
1,在datadir下创建一个表名.ibd的文件,用来保存这个表的数据。
创建一张表就是创建一个文件
所谓的表空间就是这个.ibd文件

2,一个表空间被分为多个16kb的不同类型的页,而页的大小就是InnoDB磁盘IO的单位。
这个页大小可以设置,页大小最好是4kb的倍数,因为操作系统中物理内存页为4kb
表新建的页以及表的数据量比较小时是随机的分配的:

3,InnoDB将这些页组织为B+树,B+树的一个结点就是一个表空间的页。
页有很多种
非叶子结点——索引页
叶子结点——数据页
也就是表空间中的页数据是按照B+树的形式组织和存储在这个表空间中的。

页的结构
page offset 字段表示这个页是表空间中的第几个页,
pre,next字段记录上一个和下一个页

获取一条记录的过程
数据的解析肯定不会发生在磁盘,肯定是先加载磁盘数据到内存,再解析数据。
所以获取一条数据,开始是要先获取B+树的根结点索引页数据到磁盘解析,再更具解析的结果再去获取数据,一直这样多次IO直到获取目标数据。
所以树有几层高,最多就几次IO
通过页目录利用二分查找可以快速在数据页中找到一行记录。

页——>区——>表
区是连续的页组成的区
创建表时随机分配7个页
区是后期给表分配的


表空间的组成:

InnoDB内存结构
缓存 buffer pool
一个buffer pool默认大小128m
select @@innodb_buffer_pool_size;

buffer pool中的三个链表
free,LRU,flush(脏页链表)
各个链表的作用
什么是脏页,就是buffer pool中被修改的页。
什么是预读失效
就是IO操作从磁盘获取不需要的页数据了,而这个数据页却占据LRU中的页,可能导致需要的数据页被淘汰。

为了解决预读失效,就将LRU链表分为两个部分,刚加载的放old区,访问到的再放young区,那么没被访问的就会从old淘汰。
buffer pool污染:
old区的数据页太容易将young区的数据页排挤出来。

buffer pool污染解决:
提高进入young区的门槛:
被访问+在old区停留时间超过设定时间——>才会进入young区

脏页什么时候刷入磁盘:
1,redo log日志满了。
2,buffer pool 淘汰的页是脏页时。
3,后台线程定期将脏页刷入磁盘。
4,mysql正常关闭,会将所有脏页刷入磁盘。

索引
索引的作用
主键查询:
什么是基于主键的查询,查询条件中有主键的,where 
怎么添加主键索引和外键索引:
alter table TN add primary key();
添加约束会自动建立索引
全表扫描:扫什么表
什么是辅助索引
建立辅助索引之后,建立了什么
BTREE 000
BTREE 001 
BTREE 002
这些是表文件,也就是磁盘文件中创建的索引页或者数据页。创建索引就是再开辟一些页,再用B+树来组织这些页,而这些页中存储的键值就是指定的索引字段值。
所以说索引是占据空间的。

什么是非聚集索引和聚集索引
键值相邻则数据行存储也相邻——聚集索引
键值相邻数据行不一定相邻存储——非聚集索引,只保存数据行地址,数据在磁盘中可以不相邻。
聚集索引和非聚集索引有存储引擎决定使用,不同的索引方式决定不同的数据组织方式。
一个表只能有一个聚集索引,可以有多个非聚集索引
InnoDB的辅助索引是非聚集索引。
Myisam的所有索引都是非聚集索引。
使用什么索引进行查询,取决于你用什么字段查询
查询一定都需要回表吗
什么是覆盖索引
就是查询的字段在复制辅助索引中都具有找到,不需要回表
如果只查询主键值或者主键和索引字段,就不需要回表
using index 不需要回表
using where 需要回表,而且数据的过滤发生在执行器内
using index condition

数据的处理是在存储引擎还是执行器
ICP索引条件下推index condition pushdown
作用就是让执行数据过滤的操作发生在存储引擎层,而不是获取所有数据让执行器过滤。默认开启

查询如果使用索引字段一定利用索引查询吗?
过滤的数据很少时
怎么查看一个表有哪些索引:
show index from tb;
主键索引和普通索引
普通索引查询一条记录之后还需要查询下一条记录,看看是否相等。因为普通索引可以重复。唯一索引不需要。

type的作用和7个类型

联合索引
联合索引使用哪个字段值排序
联合索引使用第一个字段进行数据组合在B+树中,其他的字段只是进行局部数据组织,所以只有查询的条件包含第一个联合索引字段时才会使用联合索引。
联合索引中的字段可以随便排序吗?
怎么排序效率更高:索引选择性越高的越往前排序

索引选择性:
字段的非重复数据个数/这个字段总数据个数
select count(distinct 字段)/count(*) from tb;
一个字段应不应该加索引
1、索引选择性是否高。
2、过滤得到的数据少。

如果你把索引字段放在表达式或者函数中,就不会使用索引查询:
from tb where id+1=7;
from tb where left(email,2)=“hi”;
left(email,2)获取前2个字符

索引的作用:
1、通过使用索引查询可以减少扫描的数据的量,提高查询效率。
2、通过建立索引,对一些字段进行了排序,不需要MYSQL再次排序,也可以提高MYSQL操作的效率。
3、索引可以将随机IO变为顺序IO。
就是因为利用索引组织的数据是有序的,所以不需要随机去查询数据,只需要顺序查询就可以得到结果。
索引的缺点:
1、索引占据磁盘空间。
一颗索引对应一颗B+树,一个结点一个磁盘页。
2、新增或者删除记录,需要额外维护索引树,有性能消耗。

前缀索引
什么是前缀索引
就是如果字段是字符类型,可以选择这个字段的前n个字符来创建索引。
为什么使用前缀索引:
减少索引占用的空间,提高查询效率

自增约束需要注意什么
1、自增约束的字段会自增吗,
2、默认第一个字段值是0、还是1
3、自增约束字段可以有多个吗
4、自增约束只能是int类型吗

如果插入的行没有自增约束字段,而是随机插入的,那么可能会出现页分裂,会发生数据迁移,影响性能。

所以主键最好是自增

事务
开启事务的三种方法
begin,start transaction,设置会话变量autocommit为off
set autocommit=off;
注意会话变量只在当前会话有效。

提交的事务还能rollback吗

事务是一条或者多条sql语句组成的不可分割的单元。
开启一个只读写事务:
start transaction read/write only;
只读事务不可以修改普通表,但是可以修改临时表。
事务的显式提交和隐式提交
系统变量auto commit 默认为on(1),也就是每一个sql语句都是一个事务,这只隐式提交事务。

当开启了一个事务之后,没有提交就再开启一个事务,那么上一个事务会被提交。
设置回滚点:

ACID
事务的原子性不是代表事务不能分割,而是形容执行的过程

原子性———undo log
哪些情况会导致事务提前结束:
MYSQL进程崩溃,操作系统崩溃,断电,事务还在执行,但是我们手动输入rollback结束事务
select不会产生日志,因为它没有修改数据
undolog怎么实现数据可回滚的?
不同的sql修改命令产生不同类型undo log——三种undolog
undo log中记录表id,以及旧数据。
undo log存放在哪?
mysql进程会为每一个进程分配undo log页面链表,从buffer pool的free中分配一些空闲缓存页作为undo log页形成undolog页面链表
undo页只有一个吗?取决于什么?undo页很多怎么组织起来?
有几个undo页链表
为什么有三种undo log只有两种undo log页面链表,因为delete属于update
undo log怎么刷盘?
脏页的刷盘和undolog没关系,事务提交才影响undolog
临时表的undo log不会刷盘,因为它只是临时表。
事务提交之后,脏页也刷盘之后,undo log页修改产生的redolog以及undo log需要删除吗?
一个客户端对应着MYSQL服务器里的一个线程
MYSQL崩溃后重启数据会丢失吗?
持久性———redo log
事务buffer pool中的数据有修改,就会产生一条对应的redo log,一旦事务提交就会将这些产生的redo log保存到磁盘中。
每一条redo log会详细记录数据所属的表,页,偏移,修改的数据等等。
redo log占据很小的数据空间
WAL:Write Ahead Logging
预写日志技术:先写入日志,再写入磁盘
redo log的格式:
哪个表的哪个页的什么位置修改的什么数据,以及数据的长度和其他信息——5
一条语句可能修改多个页,就会产生多个redolog
记录的乐观插入和悲观插入
悲观或者乐观由插入的页是否还有可插入的内存决定
往树中插入一条记录的过程可能会产生多个redolog,这多个redolog就是一个redolog组,redo log组有结束标志,如果redo log组没有结束标志,则这个redo log在生成过程中产生了问题,就不能利用这个redolog组恢复数据.

redolog是怎么保存到磁盘中的
没提交的事务产生的redo log需要写入磁盘吗?
有一个变量用来控制redolog什么时候放在哪里?log buffer page cache 磁盘
为什么要使用这个变量来控制redolog存放的状态———不同的场景需要选择不同的安全性和性能。也就是对内存和磁盘操作的选择。
这个变量的值有:1>2>0
1的安全性最好,因为事务提交redolog就写入磁盘,0的性能最好
一些redolog被写入磁盘的情况
1、后台线程定期将redolog写入磁盘。
2、redolog在形成的时候存储在log buffer内存,如果一个事务提交了,那么它的redo log 就需要从log buffer写入磁盘,而和这个事务并发的事务生成的在log buffer 中的redo log也会被写入磁盘。
默认为1
redo log写入磁盘哪个文件
存储在数据目录datadir下的ib_logfilex文件中或者datadir下的innosb_redo目录下的文件

redolog的文件可能会被使用完,怎么办:
当redo log文件满了,mysql不再执行更新操作,MYSQL会阻塞。
checkpoint变量记录可以擦除的redo log最后的位置。
innodb线程会定期将脏页刷入磁盘,检测脏页的线程检测到这个脏页已经被刷入磁盘中之后会把这个页产生的redo log标记为可以擦除(可以覆盖),那么当redolog文件满了之后,线程就会循环从头将产生的redo log覆盖可以擦除的redolog。

redolog什么时候刷入磁盘:
1、事务提交。
2、innodb每隔1秒,将log buffer中的redolog刷入磁盘。
3、redo log占满log buffer一半内存时,log buffer中的redo log会被写入磁盘。
4、MYSQL正常关闭。
脏页什么时候刷入磁盘:
1,redo log日志满了。
2,buffer pool 淘汰的页是脏页时。
3,后台线程定期将脏页刷入磁盘。
4,mysql正常关闭,会将所有脏页刷入磁盘。


undo log和redolog
产生undo log,undo log也需要写入页,产生脏页,脏页会被写入磁盘,写入页就是修改了页,此时会产生redolog。
这就可以保证还没提交的事务在系统崩溃后可以恢复数据。

Bing log
binglog由谁产生,所有的存储引擎都可以产生binglog吗
由执行器产生,所有的存储引擎都可以产生binglog。
binglog日志记录的信息:
binglog用来记录数据库表数据的修改和表结构的修改
只有select不会产生binglog。
保存在datadir下的binglog.文件中
查看binglog文件的命令:
show binary logs;
binglog的作用
1、数据备份
可以利用mysqlbinlog命令和修改数据时产生的binglog文件来恢复数据。

为什么防止有离职的员工把数据库数据清空后跑路,没了数据,要怎么办?
全量备份数据
mysqldump命令备份一个数据库的数据。
mysqldump -u root -p 数据库 > 文件路径/x.sql
备份的.sql文件记录数据,而是生成一个sql语言文件,当恢复数据时,直接执行.sql中的sql进行恢复
增量备份数据
(只备份被修改的数据)
当数据的数据被修改时,MYSQL会生成binglog,生成的binglog会记录被修改的数据的详细信息。
生成新的binglog文件的命令:flush logs;

mysql的高可用原理:
就是一台客户端设备连接多台mysql服务器,当一台mysql服务器崩溃后可以使用其他mysql服务器。
高可用需要保证主从mysql服务器数据一致性了。
怎么保证:
修改主时将主产生的binglog复制给从。
主从怎么实现binglog文件的传输:
通过同步通信,传递数据。
当从服务器获取binglog之后,根据binglog设置自己的数据库数据,达到主从同步。

redolog暂时保存在log buffer中,binglog保存在哪
mysql层的binglog cache

binglog什么时候刷盘
事务提交时
binglog也有一个变量决定binglog写入操作系统page cache之后,什么时候刷盘
这个变量值默认是多少

全量备份传输和同步
mysqldump(全量备份),scp(传递.sql文件),source(利用.sql文件修改数据)
同步之前将主服务器需要同步的表数据备份,发给从服务器,从服务器利用这个.sql备份文件刷新和主服务器一样的库的数据,保持数据相同。
2,主从同步
配置主库:
(1)MySQL配置文件:
vi /etc/my.cnf
配置文件需要配置哪些信息:
设置需要同步的库和不需要同步的数据库
创建或者指定支持主从同步的用户。
(2)配置用于主从同步的用户
配置从库:
(1)MYSQL配置文件
vi /etc/my.cnf
也是需要配置需要同步和不需要同步的数据库
(2)指定从库要连接的主库的IP,用户,密码,binglog文件,binglog文件的位置(5)。


在从服务器启动主从同步:start slave;
查看主从同步是否启动成功:show slave status\G;


现在只要主服务器指定的库发生改变,binglog写入指定binglog文件中,从服务器就可以获取修改数据进行同步了。
主从同步原理:
start slave之后发生了什么?
start slave之后两端就建立连接,并主服务器有发送binglog日志的线程,从服务器也有接收binglog日志的线程,就可以进行同步。

binglog什么时候会被什么程序发送给从服务器?
从服务器指定了要使用主服务器的哪一个binglog文件,所以是当binglog写入磁盘dl的binglog文件之后,主从器才会把修改产生的binglog日志发送给从服务器。

查看主服务器的状态:
show master status;
查看从服务器的状态:
show slave status;

读写分离:
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

你知不知道事务的提交分几个阶段
哪两阶段
事务准备提交阶段,提交阶段
每个阶段提交了什么日志
为什么要分为这两个阶段
两阶段提交保证数据一致性
这两个阶段中你认为什么设置解决了这个问题,是怎么解决的?
第一个阶段设置产生这些redo log的事务ID进入这些redo log,设置这些redolog状态为prepare然后提交这些redo log.
第二阶段设置产生这些binglog的事务ID进入这些binglog,提交这些binglog,改变redo log状态为commit。
第一个阶段提交了redo log,如果宕机就可以根据redo log的状态决定要不要提交事务,如果是commit就说明redo log 和binglog都成功刷盘,可以提交事务;如果是prepare状态,就需要去找看看有没有对应的ID的binglog,有就提交事务,没有就需要回滚。
如果不是分两个阶段提交,就可能出现下面的问题:
如果只是redolog写入磁盘了,binglog没有写入,会发生什么?如果只是binglog写入,redo log没有写入磁盘呢?
在这两个阶段中redolog和binglog分别在哪个阶段刷盘
在这两个阶段中,每一条redolog状态怎么变化
系统崩溃恢复之后根据什么决定要不要回滚数据?


redolog和binglog刷盘的时候,怎么提升刷盘性能
如果一个事务提交就刷盘一个事务生成的redolog,性能不好。
设置控制调用刷盘函数的参数的时间
让操作系统的page cache多缓存redolog组和binglog组,时间到再调用刷盘函数,这样可以一次刷盘多条日志,减少IO次数。
pagecache属于操作系统,MYSQL系统崩溃不影响其存储的数据。

redolog是保持修改的页的数据的,用来实现持久性。
binglog是执行器修改表数据时产生的日志,既然都是对修改数据的日志记录,为什么还要两个?

redolog和binglog 分别是那一层实现的,是哪种存储引擎实现的?
redolog和binglog写入文件的方式
redo log和binglog的用途
redo log用于保证数据持久性
binglog用于数据备份和主从同步

虽然redolog和binglog都是记录数据修改的日志,但是因为用途不同,记录的方式也不同。

如果不小心整个数据库数据都删除了,能用redo log恢复吗?为什么?
redolog循环写,binglog全量日志。
为什么有了binglog还需要redo log?
crash-safe  崩溃安全
因为binglog是事务提交了,binglog才会被刷盘的(实际上是先刷到操作系统page cache,当然刷到page cache断电也不会丢失),而如果事务没有提交,此时MYSQL出现崩溃,那么binglog就丢失了。但是此时可能数据已经修改,只是没有完成修改,如果没有redo log就无法回滚数据了,就是崩溃不安全了。

redolog什么时候刷盘?
binglog什么时候刷盘?
binglog不同于redo log,redo log4种情况下都可以刷盘,但是一个事务的binglog要保证一次性刷盘,只有这个事务的binglog cache满了或者事务提交binglog才会刷盘。
binglog从生成到刷盘都经历哪些地方,就是binglog刷盘的过程。
redolog什么时候被标记为可以擦除?


redo log 和binglog的区别,说4个
从产生到使用
1,在哪产生
2,未刷盘前保存在哪
3,写入文件时,日志文件满了,各自怎么处理
4,作用

并发
幻读描述的是行记录数量还是字段值?
每一个MYSQL客户端会话都有自己的一份操作的数据

为什么会产生事务并发的问题
如果两个并发的事务在串行化隔离级别下操作同一个表,那么发生什么?
后获取表的阻塞

MVCC是什么
MVCC是怎么实现的
默认隔离级别
保存事务隔离级别的变量

事务的隔离级别怎么实现的
未提交读:什么也不用,因为它什么问题都不用解决。
已提交读:MVCC
可重复读:MVCC
串行化:锁

MYSQL中的锁是什么
MYSQL中的锁不同于其他高级语言的锁是一个变量,而MYSQL的锁是一个结构类型,其中记录很多的信息,比如事务ID,事务的等待状态等。

行级锁
什么情况需要加锁
两个并发的事务可以同时写一条记录吗
怎么实现的
写写不会同时发生
读写会发生事务并发问题,读怎么解决,写怎么解决?
你知道为什么MYSQL要分共享锁,独占锁吗?
并发的事务操作记录的时候这个锁是怎么设定的,事务加在记录上的,还是获取的,如果是获取,那又从哪获取锁?
应该说获取锁的过程就是设置锁结构的过程
你知道怎么获取共享锁吗?
S锁和X锁的兼容性?
为什么X锁都不兼容?
因为除了读读,其他的事务都需要单独进行。
怎么加共享锁?
…… lock in share mode;
怎么加独占锁?
…… for update;
(update和delete都会加锁)

表级锁有哪些
表锁
什么存储引擎支持行锁和表锁?
哪些存储引擎支持表锁
表锁也分共享锁和独占锁
怎么给表加共享锁/独占
lock tables TN read/weite;
释放表
unlock tables;
能不能先获取表的共享锁,再获取表的独占锁。
事务对表加锁之后,还能访问其他表吗?
事务一次只可以锁定一个表吗?
怎么锁定多个表?
如果表中某些行加了S锁,可以给表加表级的S和X锁吗?行上加X锁呢?
表锁除了影响其他事务的读写,会影响本事务的读写吗?举个例子。

is锁和ix锁是什么锁
作用是什么
就是标记这个表已经加上了行级的S锁或者X锁,标记是为了后续如果要对这个表加表级的S或者X锁时,可以更具这个is或者ix所知道表中有哪些或者没有行锁,而如果没有IS,IX想要知道表中是否有行锁,就需要遍历表。
怎么发挥作用
这两个锁是什么时候加给谁的

事务结束,事务所产生的锁还在吗?
锁什么时候释放?
事务提交
并发的事务如果不加锁,可以各自对表增删改查,但是如果某个事务要修改表结果,比如增加行或者列,删除行或者列时,行不行,为什么?

元数据锁(meta data lock)MDL
事务对表增删改查自动加MDL读锁,如果要修改表结构,会加需要加MDL写锁。

锁的读写互斥。

全局锁:
就是对整个数据库加锁:
flush tables with read lock;
使用全局锁会限制哪些对数据库的操作?
也就是只能对数据库做什么?
怎么释放全局锁unlock tables
全局锁什么情况下使用?
全局锁的缺点?
有什么方法可以代替全局锁实现数据备份,又不影响其他事务的执行呢?原理是什么?

如果一个事务对某个表的某行加独占锁,其他事务还可以访问这个表的其他行吗?
INnodb并发性高的原因
行级锁的缺点

隔离级别哪些是用锁实现的

所有的select都不会加锁吗?
什么情况下会加共享锁,什么时候加独占锁?
串行化实现原理
什么时候事务才有真正的ID
等待获取锁的事务会一直等待吗?

查看表中锁情况的SQL语法:
select * from performance_schema.data_locks where object_name='student'\G;

间隙锁
间隙锁为什么称为间隙锁?
间隙锁锁定区间的开闭?
间隙锁向前锁还是向后锁?

普通字段,就是对字段进行查询,无论是等值查询,还是范围查询,事务都会给整个表的区间,负无穷到正无穷加上n个间隙锁,这样就可以防止其他的修改,从而防止幻读。
对于非普通字段呢,比如主键字段?

naxt-key lock 临键锁
临键锁是什么锁的组合?
作用是什么?
临键锁的开闭区间。
插入意向锁
处于阻塞状态事务会插入锁吗?
什么情况下会插入?
插入什么类型的锁?
插入的意向锁状态是什么状态?
插入意向锁属不属于间隙锁,为什么?

间隙锁和临键锁的区别,至少说两点。

MYSQL是怎么加锁的?
加锁的对象是什么?
你利用一个非索引字段查询时,依然会对索引字段上锁
加锁的基本单位是什么锁?

唯一索引等值查询,记录存在和不存在情况下的锁变化
存在
在等值查询,查询条件存在的情况下,临键锁会退化为什么锁?也就是说,记录锁是怎么加上去的?
等值查询,而且查询的记录不存在时
比如id=4
不存在时,临键锁退化为什么锁,间隙锁锁住(1,5)区间的记录。

唯一索引范围查询
大于和大于等于
大于:每一个扫描到大于的索引都会加临键锁,最后对正无穷加临键锁。
大于等于:
等于如果不存在,就是大于的加锁情况。
等于如果存在,等于的索引的临键锁退化为记录锁,退化为记录锁就不需要包含小于的索引,大于的就是大于的情况。

小于和小于等于
小于:扫描到的所有小于的索引都加临键锁,最终第一个大于的索引临键锁退化为间隙锁。
小于等于:
等于如果不存在就是小于的情况。
如果存在,那就是说要最后包含等于的索引记录,只需要等于保持临键锁就可以了。

如果不是修改,只是简单的读取,临键锁中的记录锁用什么?

使用非唯一索引,存在二级索引的加锁
利用二级索引查询,二级索引和主键索引都需要加锁吗?
等值查询
存在
不存在
不管存在还是不存在,所有扫描到的二级索引都加临键锁,最后一个终止的二级索引的临键锁退化为间隙锁。如果等值存在,查询到的主键索引加锁记录锁,如果不存在,就加不了。

二级索引是怎么存放的?
当二级索引值相同,又该如何存放?
一个记录是否可以插入,取决于什么?

一个记录或者一个区间记录是否可以获取,以及是否可以对一个区间插入数据,取决于什么?
已经被其他事务加锁,且加锁情况不兼容不可获取。插入的记录会被插入已经加锁的范围,不可插入。

非唯一索引范围查询
对于唯一索引,如果大于等于存在等于,等于索引的临键锁退化为记录锁,那对于非唯一索引大于等于存在呢,会退化吗?为什么?
小于等于的,最后的终止索引的临键锁也不会退化,依然是临键锁。
为什么非唯一索引查询大于等于和小于等于等于条件不退化化?
记录锁可以防止哪些操作,记录锁可以防止幻读吗?间隙锁呢?

查询条件使用非索引字段查询或者查询没有走索引,会加锁吗,怎么加锁,加什么锁?

update和delete如果不加索引会怎么样?
update和delete这些查询加索引就一定走索引吗?
update和delete优化=where+limit+索引
innodb的默认隔离级别能解决三个事务并发问题吗?
innodb怎么解决幻读问题的?

什么是MVCC?
什么是版本链?
什么是隐藏列?
这两个隐藏列是什么,作用是什么?
trx_id记录的是哪一个事务修改产生的这个记录,产生这个记录的事务,已经记录产生之后开启的事务都可以访问这个版本的记录。
read view是什么?
read view中的四个字段
read view第一个字段记录当前事务,也就是产生这个read view的事务的ID,也就是说这个read view是用来标识本事务的,用来和各个版本的记录做对比,看看这个read view对应的事务能不能使用对比的版本。
一个事务通过什么确定自己对版本记录能不能访问?
通过事务的ID和版本记录的ID对比。
如果一个事务的id存在于一个记录的某个版本的trx_id中,说明这个事务对这个记录修改过,那么这个版本的记录对于这个事务是可见的数据

并发的事务产生的ID在read view中属于哪部分?
read view和版本记录对比的四种情况:
属于本事务的版本记录
非并先生成
非并后生成
并发未提交
并发已提交
可见——已提交可见——未提交可见——不可见
版本记录的遍历是从哪个版本开始遍历?
MVCC多版本并发控制:
是什么的多版本,这个版本是怎么形成的?
MVCC的实现原理?
就是事务通过生成read view和版本记录中的事务ID进行对比,检测本事务对此版本记录的使用权限。
读已提交的解决脏读,不能解决不可重复读的原理?
每次语句执行前都重新生成read view就可以重新标记read view中的ID字段,那些已经提交的版本记录就可以使用了。
读已提交为什么不可重复读?
重新生成的版本记录可能已经被其他事务修改过了。
可重复读原理?
整个事务处理的过程只生成和使用一个read view,所以只操作最开始状态下标版本。
为什么以上两个隔离级别不能解决幻读问题?
就好像备份了一份记录,整个过程都在使用这个备份。
因为版本记录只标记每一个记录,不能控制多个记录。
MVCC为什么可以实现数据备份?

begin事务就启动了吗?
如果按照非并发后生成修改数据会发生什么?
为什么会这样?
修改数据和读取数据不一样。
怎么解决的?
读取当前记录数据进行修改。
各种undo log的作用和销毁时间?
update undo log和delete类型的undo log并不会在事务提交后立刻销毁。那什么时候销毁?
no值,undo log 会记录系统给自己的no值,生成的read view也会有一个no值,purge会取最早的read view和undo log的no比较,undo log的no小于read view的no就销毁这些undo log,因为此时的undo log的事务已经提交,不需要这些undo log了。

mysql空闲链接会一直存在吗?
mysql可以建立的最大连接数是多少,由什么决定?
MYSQL客户端和服务端建立连接,是基于TCP的还是UDP的?
MYSQL服务器维护长链接可能导致什么问题?怎么解决?
连接器三个作用
什么类型的语句会存储在查询缓存中?
查询缓存中的数据是怎么存储的?
为什么8.0版本之后的MYSQL服务器不要查询缓存了?
分析器做哪两步工作
什么是词法分析
分析SQL语句的的词,构成SQL语法树
什么是语法分析
看SQL语句是否满足SQL语法
优化器负责做什么
定制SQL语句的执行方案,比如索引的选择
执行器的工作
执行SQL语句,提供存储引擎接口
表数据直接保存在datadir指定的路径下吗?
创建的库名,本质上是在哪创建了什么?
表空间中的5个存储结构
只分配随机页有什么问题
分配连续的区解决了什么问题
段分为哪三个段,内个段是哪些区的集合?
roll_pointer到底指向的是什么:
指向这行记录的上一个记录的undo log。
varchar(n)中的n表示什么?是表示字节数还是字符数?
MYSQL一行的大小没有限制吗?
65535
如果表中只有一个字段是varchar类型,可以创建varchar(65535)吗,为什么?
溢出页是用来做什么的?
如果行的数据溢出怎么办?
原来的行记录怎么找到溢出页呢?

索引
用一句话来概括什么是索引
索引就是帮助存储引擎快速获取数据的一种数据结构,就是存储引擎查询记录的目录
索引有哪些
B+树的好处:
千万级别的数据量在B+树中只需要存储3~4层,也就是说查询时最多只需要进行3~4次IO,查询效率非常高。
什么是覆盖索引和回表?
为什么INnodb现在B+树不选择HASH?
hash只适合等值查询,不适合范围查询。
联合索引不使用最左前缀原则会发生什么——索引失效
使用联合索引时,索引字段在where中的顺序可以随意吗,为什么?
索引的缺点
说四个适合创建索引的场景
说四个不适合创建索引的场景
哪些情况下索引会失效:
1、使用联合索引不满足最左前缀原则
2、对索引字段使用函数
3、索引字段加入表达式中
4、对索引字段使用包含左模糊查询
5、索引字段发生类型转换的时候
说一下 select "10">9;的结果是什么?
前缀索引需要满足最左前缀原则吗
需要———左模糊查询索引失效
前缀索引左模糊查询一定索引失效吗,为什么?
如果二级索引中就有需要查询的所有字段,那么左模糊查询就会全扫描整棵树去找到数据,就不需要全表扫描记录很多数据的聚集索引了。
联合索引什么情况下不遵循最左前缀原则也可以走二级索引,不会索引失效呢?
要查询的字段都可以在联合索引中找到时。
count的各种类型的性能

隔离级别
可重复读什么时候MVCC就可以解决幻读,什么时候需要加间隙锁?
当事务的ID大于等于可分配ID时,说明什么?
说明这个事务是生成这个read view之后才开启的
可重复读完全可以避免幻读现象吗,举个例子?
就是当AB两个事务并发,B事务执行完成后提交,虽然A事务不能查询B事务的修改,但是却可以通过update修改B事务的修改后提交的数据,这样A事务就可以查询B事务的修改,如果是修改行就会造成幻读。

死锁的发生和解决办法
锁加在哪里:
记录的索引上
什么情况下会发生死锁,举个例子?
两个并发的事务:
一个事务插入编号为7的记录
一个事务插入编号为8的记录
两个事务都先select…for update,对某一部分相同数据索引加上间隙锁
(间隙锁是兼容的,虽然也有X和S型)
然后两个事务都要进行:
insert操作,插入之前事务要先判断有没有其他事务在插入的位置加了锁,如果有,自己就不能插入数据,而是要插入一个插入意向锁。
但是插入意向锁和间隙锁是互斥的
也就是说,其中一个事务想要插入插入意向锁就要等待另一个事务释放间隙锁,但是此时两个事务都在等待对方释放,就形成了死锁。
怎么解决?
innodb有两种解决死锁的办法:
1、设置事务等待加锁的超时时间参数
如果事务加锁超过这个指定的时间都没有加锁超过,就回滚事务,释放自己已经加的锁。
2、开启主动死锁检测功能
这个功能开启后,MYSQL如果检测出发生死锁会回滚发生死锁的一条个事务,让其他事务得以进行。(这个参数默认开启)

索引

一个表中有a,b,c三个字段,ab是来联合索引。

1,select a,b from table where a=value会走索引吗?

Extra:Using index----索引覆盖;

走辅助索引

2,select b,c from table where a=value会走索引吗?

Extra:null

结论:走不走索引和查询的字段无关,和用于查询的字段有关,既where后面的字段。

缓存一致性怎么解决

链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值