表中的主键 外键 是什么
dml、dcl、ddl都是啥?
dml数据操纵语言(select、update、insert、delete);
ddl数据库定义语言,create、alter、drop;
dcl数据库控制语言,权限这一块的(grant等)。

你说一下整个sql的执行流程是什么
一条sql查询过来以后,建立连接(通过数据库连接池),先查询缓存,此sql之前是否有被查询过,如果被查询过则直接返回结果,没有被查询过得话,先通过解析器进行解析,通过优化器去生成一条条的执行计划,通过执行引擎去将这些执行计划去执行,执行完毕以后,从文件系统获取sql执行之后获得的信息
通信方式是半双工通信 ,缓存默认是开启的
执行的sql的日志有多少种:
1.错误日志文件;2.通用查询日志文件;3.慢查询日志文件;4.二进制文件
执行sql有语法错误,就会被记录到错误日志文件中去;如果sql执行时间太长 就被记录到慢查询日志文件里面去;那么我们到时候直接去对应的文件里面去查询就行了
数据文件有哪些
一个数据库是一个目录,目录下一个表对应三个文件,文件名是表名,扩展名分别是.frm、.MYD、.MYI((数据文件:. myd )、( 索引文件(myindex):. 简写,MYI )、(表定义文件:. frm))。
myindex:简写 myi和mydata:简写myd就是innodb引擎里面的非聚簇索引的文件;
frm就是聚簇索引文件,主键索引是聚簇索引
聚簇索引和非聚簇索引吗?
sql接口
解析器
解析器里面有一个预处理,就是先解析成树,然后先预处理检查一下语法等问题,然后再解析成新的树。
查询优化器
有相关优化策略:等价交换策略(例如:5=5 and a>5,优化之后是a>5)
执行的sql都是mysql根据自己定义的策略优化成最优。
了解哪些引擎
查询引擎类型
存储引擎
引擎的作用
innodb 支持事务 数据的回滚和恢复;
my那个不支持事务,也不支持外键,但是速度快
面试题:innodb、my两种引擎的对比
事务处理上方面:
(1) InnoDB提供事务支持事务,外部键等高级 数据库功能
MyISAM类型其执行数度比InnoDB类型更快,但是不提供事务支持;
(2) InnoDB支持的是行级锁,锁定指定记录
my支持表锁
(3) innodb使用的是聚集索引
my使用的是非聚集索引
(4) innodb除了支持行级锁,还通过支持读写阻塞,来采用mvcc机制的并发控制来支持高并发
my使用的是表锁会导致并发效率低
(5)存储文件
innodb只生成一个存储文件frm(包含数据和索引),而myisam会生成两个文件myd和myi(一个数据文件、一个索引文件)
mvcc机制
MVCC带来的好处:多版本并发控制(MVCC)是一种用来解决读-写冲突 的无锁并发控制
3.2.1 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写 操作也不用阻塞读操作,提高了数据库并发读写的性能;
3.2.2 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不 能解决更新丢失问题.
面试题:innodb的内存结构是什么

主要有四个部分:buffer poll、change buffer、log buffer、一个自适应的hash索引
流程:当用户来查询的时候,先去缓冲区读取数据 如果没有 那么就去底层数据去获取,这里的缓冲区就是buffer pool,如果说 这里是写 或者update,先去缓冲区找需要修改的数据 ,如果 找到了,那么就直接修改,如果说 没有找到需要修改的数据,change buffer里面去记录这个操作,怎么操作呢?操作写的操作,指令记录下,放在这个change buffer,并异步更新数据库,然后如果有人想要读取这个修改的数据,那么他就会将这个写、修改的指令和buffer pool里面的数据做整合,并返回整合以后的数据。。。缓冲区是以page为单位,一个page 16kb
对于读请求,缓冲池能够减少磁盘IO,提升性能,缓冲区有就直接读,没有就读磁盘,并写入缓冲区;对于写请求,两种情况(1)增删改的数据在缓冲区中,直接修改缓冲池中的数据,一次内存操作;写入redo log,一次磁盘顺序写操作;效率是最高的(2)增删改的数据不在缓冲区中,先将数据从磁盘加载到缓冲池,一次磁盘随机读操作;修改缓冲池中的页,一次内存操作;写入redo log,一次磁盘顺序写操作;
写请求在没有命中缓冲池的时候,至少产生一次磁盘IO,对于写多读少的业务场景,是否还有优化的空间呢,解决方案:写缓冲区。什么是InnoDB的写缓冲?针对insert、delete和update做了优化,叫做写缓冲(change buffer),写缓冲是降低磁盘IO,提升数据库写性能的一种机制。它是一种应用在非唯一普通索引页(non-unique secondary index page)不在缓冲池中,对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(buffer changes),等未来数据被读取时,再将数据合并(merge)恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。InnoDB加入写缓冲优化,上文“情况二”流程会有什么变化?修改数据时,数据正好不在缓冲池内。加入写缓冲优化后,流程优化为:
(1)在写缓冲中记录这个操作,一次内存操作;
(2)写入redo log,一次磁盘顺序写操作;
mysql的索引类型有哪些
- 普通索引:普通字段建立的索引
- 唯一索引:字段值唯一 但是允许为空
- 主键索引:字段数据唯一 但是不允许为空
- 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
- 全文索引:数据量大,使用like检索效率比较低下的,所以在文本字段上添加全文索引
聚簇索引和非聚簇索引:聚簇索引的数据和索引在一起,非聚簇索引的数据和索引不在一起;
什么是辅助索引:不是主键的字段创建的索引
使用场景:B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引
innodb里面,主键索引是聚簇,其他都是非聚簇索引;如果是myi的话,那么都是非聚簇的
索引的流程

在很多时候我们通过索引去查的时候,并不是通过主键索引,而是通过辅助索引先查到id(也就是主键索引值),再通过这个主键索引值id去查询整条完整的数据。
很多时候并不是通过id去查询的,有通过分数、名称等字段去查询的。
如果通过id去查询的话,直接通过主键索引就能获取想要的数据
为什么我们的二级索引的叶子节点放的是id(主键索引)?
因为非聚簇索引 她想要的数据是分开的,那么我这里其实是可以放想要的数据的地址,但是我还要继续去另外一个文件去根据地址查找 比较麻烦,性能也不是很高,所以 我们利用聚簇索引的特点,那么我们放id值,再根据一次id值去获取我们想要的数据,这个效率更高,索引设计师就选择了放id值,辅助索引就用来查找id的。
全文索引的概念以及实现原理
全文检索的实现是什么:先建立索引,再对索引进行搜索
这里的索引是怎么建立的:FullText index
怎么查询,存在一个怎样的失效场景:
select from table where match(字段) againt(‘字符’) 。这里有一个失效:索引字段的值必须要在3到84个字符的长度。比如 select from table where match(name) againt(‘a’) ,数据库里面有4条记录,name 是 a、aa、aaa、aaaa,那么那个against里面写a和aa,基本上都查询不到数据的,只有写3个a的时候才能查询到
全文检索还有等值匹配问题:select from table where match(name) againt(‘aaa‘ in boolean mode)
这里的通配符不是前加后加,而是只要在后面加就行了;这里加号,意思就是只要包含aaa的结果都显示出来,前提是3到84个字符,使用号需要 后面加上 in boolean mode,不加* 那么就是等值 写几个a 那么就只查询出来几个a的数值。
全文索引必须在字符串、文本字段上建立。全文索引字段值必须在最小字符和最大字符之间的才会有效(innodb:3-84;myi:4-84)全文索引字段值要进行切词处理,按syntax字符进行切割,例如b+aaa,切分成b和aaa,文索引匹配查询,默认使用的是等值匹配,例如a匹配a,如果想匹配可以在布尔模式下搜索。
索引的原理是什么
排好序的数据结构
建立索引能增加查询速度,但是增删改的速度也会变慢,因为需要维护索引空间
什么叫索引覆盖?什么叫做回表?
直接通过辅助索引(包括组合索引)就能实现所有字段的查询 ,创建索引的这个动作叫做索引覆盖。
那么回表就是先走辅助索引,再去主键索引中查询 这个就是二次查询了 所以也叫做回表
select id,name,age from 表 where name=1如何优化?
就是name、age做一个组合索引,然后就通过一次辅助索引就可以实现所有字段的查询
索引优化里面还有一个最左前缀原则
比如age,name 组成一个组合索引 如果你查询条件where name=1,这个sql走索引了吗?
没有,就是有最左前缀原则,条件里面必须有age,而不必有name.
sql的优化有几种
表结构设计优化:
mysql层面优化:
1、将缓冲池内存尽可能的调高(参数配置),减少i/o操作;脚本预热,将数据预热到缓冲池;
sql优化:
1、索引覆盖 避免回表
2、最左前缀原则
3、索引失效,避免全表扫描
3.1、MySQL在使用Like模糊查询时,索引是可以被使用的,只有把%字符写在后面才会使用到索引
**
where name=1 and age=2 and hobby=3 order by age,sex
MySQL查询支持filesort和index两种方式的排序,filesort是先把结果查出,然后在缓存或磁盘进行排序
操作,效率较低。使用index是指利用索引自动实现排序,不需另做排序操作,效率会比较高。
什么引起慢查询
SET global slow_query_log = ON,这个是开启慢查询日志的命令
SET long_query_time = 10;这个是设置慢查询的时间,超过10秒则会被记录
列如:select from student where age=18 and name like ‘徐%’;现在数据库有1个亿的数据,你怎么优化这个sql
1、age、name做组合索引;
2、标明具体显示行
3、显示行展示列都加入组合索引,即覆盖索引
mysql 参数调优
buffer poo优化
将缓冲区设置成总内存的60%到80% 然后将实例多设置几个 避免缓存的争夺
缓冲区是一块比较大的地方,里面有实例,实 例里面有块,块里面有page页。当我们有写请求过来的时候,这个时?
https://blog.csdn.net/shenjian58/article/details/93691224
对数据进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(buffer changes),等未来数据被读取时,再将数据合并(merge)恢复到缓冲池中的技术。
changebuffer是占用的buffer pool的内存,一般占用大小为25%,最大为50%。
写多读少的业务,才需要调大这个值,读多写少的业务,25%其实也多了。
遗漏问题,为什么写缓冲优化,仅适用于非唯一普通索引页呢?
当我们查询的索引设置了唯一性,那么我们就要去做这样的校验,那么校验的过程需要我们去进行一次磁盘的io操作(否则怎么校验是否唯一?),那么既然都磁盘io操作了,那么就还不如直接查询 然后再直接再缓冲区修改
log buffer
什么情况下会触发redo日志进行一次刷盘操作
1.log buffer的缓冲区满了
log buffer这里有一个配置:innodb_flush_log_at_trx_commit
每隔1秒写日志文件和刷盘操作(写日志文件LogBuffer—>OS cache,刷盘OS
cache—>磁盘文件),最多丢失1秒数据
1:事务提交,立刻写日志文件和刷盘,数据不丢失,但是会频繁IO操作
2:事务提交,立刻写日志文件,每隔1秒钟进行刷盘操作
事务提交意思是:我们的redo日志真正刷盘到本地磁盘的过程中 需要经过个os catch
真正意义上的刷盘 其实是os catch和磁盘的交互
磁盘结构
表空间的概念
mysql数据库中有5种表空间:https://blog.csdn.net/weixin_35414437/article/details/113253903
explain执行计划

id:
(1)select 查询的序列号,表示select子句的操作顺序
(2)id相同—>执行顺序从上到下
(3)id不同—>id值越大优先级越高
select_type:查询的类型,主要区分普通查询、联合查询、子查询等复杂查询
(1)simple:查询不含union或者子查询(关联查询仍然是simple)
(2)primary:包含任何复杂的子部分查询如子查询、union等,最外层的查询则被标记为primary。
(3)subquery:位于select或者where后面的子查询为subquery。
(4)derived:位于from后面的子查询,被标记为derived,mysql会递归执行并把结果放在一个临时表中。
(5)union:出现在union之后的select。
(6)union result:从union表获取结果的select
table: 显示这一行的数据是关于哪张表
type:查询使用了何种类型,从好到坏依次为:system>const>eq_ref>ref>range>index>all
possible_keys:
显示可能应用在这张表中的索引,一个或者多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
key:
实际使用的索引。如果为null,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的selet字段重叠,仅出现在key列表中。
覆盖索引:查询的字段与所建索引的字段个数和顺序刚好吻合
key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常量。那些列或者常量被用于查找索引列上的值
rows:根据表统计信息及索引选用情况,大致估算出找到所需要记录要取得行数。
filtered:
extra:包含不适合再其他列中显示但十分重要的额外信息
B树和B+树的各自结构的特点、B树和B+树的区别
mysql的锁
mysql的四大特性
mysql是如何做事务的并发控制、
1.mysql不做事务控制会造成什么问题
1、数据丢失(数据覆盖):为甚丢失?怎么丢失的?回滚覆盖,提交覆盖;撤销一个事务时,把其他事务已提交的更新数据覆盖(事务A和B并发执行,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了)。
为甚丢失?两种情况
回滚覆盖:一个事务回滚操作,把其他事务已提交的数据给覆盖了
提交覆盖:一个事务提交操作,把其他事务已提交的数据给覆盖了
2、脏读:一个事务读到另一个事务未提交的更新数据(事务A和B并发执行,B事务执行更新后,A事务查询B事务没有提交的数据,B事务回滚,则A事务得到的数据不是数据库中的真实数据。也就是脏数据,即和数据库中不一致的数据)。
3、幻读::一个事务读到另一个事务已提交的新插入的数据(A和B事务并发执行,A事务查询数据,B事务插入或者删除数据,A事务再次查询发现结果集中有以前没有的数据或者以前有的数据消失了)。数据量不一致
4、不可重复读:一个事务读到另一个事务已提交的更新数据(事务A和B事务并发执行,A事务查询数据,然后B事务更新该数据,A再次查询该数据时,发现该数据变化了)。数据内容不一致
2. mysql做了什么?四种隔离级别
1、Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新(事务执行的时候不允许别的事务并发执行。事务串行化执行,事务只能一个接着一个地执行,而不能并发执行。)。
2、Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。(mysql)
3、Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。(oracle)
4、Read Uncommitted(读未提交数据):一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。
3.事务的隔离级别的本质是什么?有没有想过锁
读和写操作:读读(不加锁)、写写、读写、写读
读写锁:解决事务的隔离性,通过对同样的数据
mvcc,多版本控制
多版本控制MVCC,也就是Copy on Write的思想。MVCC除了支持读和读并行,还支持读和写、写和读
的并行,但为了保证一致性,写和写是无法并行的
