Mysql复习内容

文章目录

    • **数据库基础知识**
    • **mysql有关的权限表都有几个?**
    • **mysql有哪些数据类型?**
    • **引擎**
    • **Mysql存储引擎MyIsam与innodb有什么区别?**
    • **Mylsam索引与Innodb的区别?**
    • **innodb引擎的四大特性有哪些?**
    • **存储引擎的选择?**
    • **索引**
    • **事务**
    • 标题**锁**
    • **视图**
    • **触发器**
    • **常用SQL语句**
    • **SQL优化**
    • **数据库优化**

数据库基础知识

什么是三大范式?
第一范式:每个列都不可以再拆分,就是独立的

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。(举例:【学号,课名】可以决定姓名、年龄、成绩,但是学号可以单独决定姓名,而课名也可以单独决定学分。这就不满足第二范式的要求)要把它拆解为Mysql复习内容_第1张图片外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]

第三范式:在第二范式的基础上非主键列只依赖于主键,而不依赖于非主键列(把它分为三个属性即可,对于学生表,主码为学号,主属性为学号,非主属性为姓名、系名和系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,不符合3NF的要求。
为了让数据表设计达到3NF,我们必须进一步进行模式分解为以下形式:
选课(学号,课名,分数)
学生(学号,姓名,系名)
系(系名,系主任))

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

< user权限表:记录连接到用户的账户信息,里面的权限是全局级的
< dB权限表:记录各个账号在各个数据库上的操作权限
< table_priv:记录数据表级的操作权限。
< columns_priv:记录数据列级的操作权限
< host权限表:这个权限表不受REVOKE和GRANT操作的限制

mysql有哪些数据类型?

1、整形(int)
2、实数类型(FLOAT、DOUBLE、DECIMAL
DECIMAL可以存储比bigint还要大的整型,能存储精确的小数。
而float和double是有取值范围的
3、字符串类型包括varchar\char\text\blob
使用策略:char比varchar更好,因为char不容易产生碎片
对于非常短的列,char比varchar在存储空间上更有效率

引擎

Mysql存储引擎MyIsam与innodb有什么区别?

innodb:提供了行级锁和外键的约束,innodb是为了处理巨大信息量提供最大性能而设计的,只有在innodb存储引擎中,表的大小才是任意的。
Mylsam:不提供事务的支持,也不支持行级锁和外键
MENORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高

Mylsam索引与Innodb的区别?

反正记住innodb是非常高效的就可以了,innodb索引是聚蔟索引,而MYISAM是非聚蔟索引

innodb引擎的四大特性有哪些?

插入缓冲(insert buffer)
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)

存储引擎的选择?

如果没有特别的要求,存储选用默认的innodb即可
MYLSAM:以读写插入为主的应用程序,比如博客系统,新闻门户网站
INNODB:更新操作频率也高;并发量高,支持事务和外。

索引

简要概述索引
《 索引包含对数据库所有记录的引用指针。
《 索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据

索引有哪几种类型?
主键索引**:数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引ALTER TABLE table_name ADD unique(column)
普通索引:ALTER TABLE table_name ADD index index_name(column)
全文索引ALTER TABLE table_name add fulltext(column)
索引的数据结构(b树,hash)
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。

1)B树索引

mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

查询方式:

主键索引区:PI(关联保存的时数据的地址)按主键查询,

普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快

B+tree性质:

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

2)哈希索引

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。

索引的基本原理
索引的算法有哪些?
索引算法有b树法和哈希算法
B树法
B树法其实就是mysql的基本算法,例如

select * from user where name like 'jack%';

HASH算法
HASH索引只能用于对等比较,例如=,<=>操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远远高于Btree索引

索引设计的原则
1、基数较小的列,没有必要建立索引。
2、使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间。
3、不要过度索引,因为索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个更新的时间就会越长。
创建索引的三种方式,删除索引
还有添加索引,例如

ALTER TABLE table_name add index index_name(column_list);

ALTER TABLE用来创建普通索引、unique索引或者primary key索引。
其中table_name是要增加索引的表名,column是指对哪些列进行索引。

使用索引查询一定能提高查询的性能吗?为什么
1、索引查询并不一定能够提高查询效率的,每当表中增减或索引列被修改时,索引本身也会被修。这意味着每条记录的insert,delete,update将会为此多付出4,5次的磁盘i/o。
2、因此,索引的查询一般基于一个范围的检索,一般查询返回结果集小于表中记录数的%30,。
3、基于非唯一性索引的检索。
百万级别以上的数据如何删除
关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的io,会降低增/改/删/的执行效率。所以,在我们删除数据库百万级别数据的时候,查询mysql官方手册得知删除数据的速度和创建的索引数量是成正比的。
1、所以,我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分钟)
2、然后删除其中无用数据
3、删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约10分钟左右
4、与之前的删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚
前缀索引
什么是最左前缀原则?什么是最左匹配原则
○顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边
○最左前缀匹配原则,非常重要的原则,mysql会一直向右直到遇到范围查询(><\between,比如遇到a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)的索引则都可以用到,a,b,d的顺序可以任意调整。
○=和in可以乱序,比如a=1 and b=2 and c=3建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

B树和B+树的区别
在B树当中,你可以将键和值存放在内部节点和叶子节点;但在B+树当中,内部节点都是键,没有值,叶子节点同时存放键和值。
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
使用B树的好处
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在跟节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。

使用B+树的好处
由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只要使用很小的时间找到最小的一个节点,通过链进行o的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间
Hash索引和B+树索引有什么区别或者说优劣呢?
hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,然后根据查询判断是否需要回表查询数据。
B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发。对于每一次的查询都是从根节点出发,查找到叶子节方可以获得所查键值,然后根据查询判断是否需要回表查询数据
hash索引进行等值查询更快,但是却无法进行范围查询。
因为在哈希索引中经过hash函数建立索引后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的所有节点皆遵循,天然支持范围。
hash索引不支持使用索引进行排序,原理同上。
hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是 因为hash函数的不可预测。
hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引)的时候可以只通过索引来完成查询。
hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定对于所有的查询都是从根节点到叶子节点,且树的高度较低。

数据库为什么使用B+树而不是B树?
B树只支持随机检索,而B+树同时支持随机检索和顺序检索;
B+树的查询效率更加稳定。b树搜索有可能在非叶子节点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而B+树当中,顺序检索比较明显,随机检索时,任何一条关键字的查找必须走一条从根节点到叶节点的路,所有的关键字查找路径长度相同。
B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整课树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。
增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可以很好提高增删效率。
B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据
在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了key值以及整行的数据,这就是聚簇索引和非聚簇索引。在innoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则隐式地生成一个键来建立聚簇索引。
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行徽标查询。
什么是聚簇索引?何时使用聚簇索引与非聚簇索引
聚簇索引:将数据存储与索引放到一块儿,找到索引也就找到了数据
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时,在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这就是为什么索引不在key buffer命中时,速度慢的原因。
非聚簇索引一定会回表查询吗?
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。
举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age<20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
联合索引是什么?为什么需要注意联合索引中的顺序?
Mysql中可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。
具体原因为:
Mysql使用索引时需要索引有序,假设现在建立了“name,age,school"的联合索引,那么索引的排序为先按照name排序,如果name相同,再按照age排序,如果age的值也相等,则按照school进行排序。

当进行查询时,此时索引仅仅按照name严格有序,因此首先必须使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用作索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁,或者字段选择性高的列放在前面。此外可以根据特列的查询或者表结构进行单独的调整。

事务

什么是数据库事务?
事务是一个不可分割的数据库操作系列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一种操作,要么都执行,要么都不执行。
拿一个最简单的例子来说就是转账了
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,那么小红的余额就要增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红余额没有增加,这样就不对了。事务就是保证二者都成功,否则都失败
事务的四大特性(ACID)介绍一下?
|原子性| |
|-一致性-|–|
| 隔离性 | 持久性 |
1.原子性:事务最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
2.一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
3.隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
4.持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响;

什么是脏读?幻读?不可重复读?
脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读:在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
什么是事务的隔离级别?Mysql的默认级别是什么?

标题

对Mysql的锁了解吗?
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
就像酒店里面的钥匙,多人抢同一个房间就是没有锁的机制
隔离级别与锁的关系
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会被修改的数据上的排他锁冲突
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁
按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法

从锁的类别上分mysql都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?
Mysql中InnoDB引擎的行锁是怎么实现的?
InnoDB存储引擎的锁的算法有三种
什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
1.如果不同程序会并发存取多个表,那么尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2.在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3.对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
4.如果业务处理不好可以用分布式事务锁或者使用乐观锁
数据库的乐观锁和悲观锁是什么?怎么实现的?

视图

为什么要使用视图?什么是视图?
为了提高复杂SQL语句的复用性和表操作的安全性,MYSQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
视图使开发者只关心感兴趣的某些特定数据和所负责的特定事务,只能看到视图中所定义的数据,从而提高了数据库中数据的安全性。
视图有哪些特点?
1.视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
2.视图是由基本表产生的表。
3.视图的建立和删除不影响基本表。
4.对视图内容的更新(添加、删除和修改)直接影响基本表。
5、当视图来自多个基本表时,不允许添加和删除数据。
6、视图的操作包括创建视图,查看视图,删除视图和修改视图。
视图的使用场景有哪些?
视图根本用途:简化sql查询,提高开发效率。如果说还有另外一个用途那就是兼容老的表结构。
下面是视图的常见使用场景:
1、重用sql语句
视图的优点与缺点
什么是游标?
游标就是系统为数据开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理
存储过程与函数
什么是存储过程?有哪些优点和缺点?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
优点
1)存储过程是预编译过的,执行效率更高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,减少数据库开发人员的工作量。
缺点
1)调试麻烦,但是用PL调试很方便,弥补这个缺点。
2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

触发器

什么是触发器?触发器的使用场景有哪些?
触发器是指一段代码,当出发某个事件的时候,自动执行这些代码。
使用场景
1.可以通过数据库当中的相关表实现级联更改。
2.实时监控某张表中的某个字段的更改而需要做出相应的处理
3.例如可以生成某些业务的编号。
4.注意不要滥用,否则会造成数据库及应用程序的维护困难
Mysql中都有哪些触发器?
1.before insert
2.after insert
3.before update
4.after update
5.after delete

常用SQL语句

SQL语句主要分为哪几类?
超键、候选键、主键、外键分别是什么?
六种关联查询是什么?
什么是子查询?
子查询的三种情况
mysql中in和exists的区别
varchar与char的区别?
varchar(50)中50的含义?
int(20)中20的含义
mysql中int(10)和char(10)以及varchar(10)的区别
float和double之间的区别?
drop、delete、turncate的区别是什么?
union与union ALL的区别?

SQL优化

如何定位及优化SQl语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?

SQL的生命周期**?**
大表数据查询,怎么优化?
超大分页怎么处理?
MySQL分页
慢查询日志
关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
为什么要尽量设定一个主键?
主键使用自增id还是UUID?
字段为什么要定义为not null?
如果要存储用户的密码散列,应该使用什么字段进行存储?
优化查询过程中的数据访问
优化长难的查询语句
优化特定类型的查询语句
优化关联查询
优化子查询
优化LIMIT分页
优化UNION查询
优化where子句

数据库优化

为什么要优化?
数据库结构优化
mysql数据库cpu飙升到百分之500的话他该怎么处理?
大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?分库分表了是怎么做的?分表分库了有什么问题?有用到中间件么?他们的原理知道吗?
垂直分表
缺点
水平分表
试用场景
水平切分的缺点
MYSQL的复制原理以及流程
读写分离有哪些解决方案?
备份计划,mysqldump以及xtranbackup的实现原理
数据表损坏的修复方式有哪些?

数据库基础知识

你可能感兴趣的:(笔记)