MySQL面试简答题
程序员文章站
2022-06-26 08:08:51
题目1.什么是关系型数据库?2.关系型数据库有什么优势?3.简述什么是SQL?4.什么是MySql?5.简述Mysql有哪些数据类型?6.Char和VarChar的区别?7.Int和bigint能储存的数据大小一样吗?8.InnoDB引擎的四大特性是什么?9.MyISAM与InnoDB存储引擎的5大区别10.说一下数据库三范式设计是什么?11.SQL 语句有哪些分类?12.使用 MySQL 视图有何优点?13.索引是个什么样的数据结构呢?14.联合索引是什么?为什么需要注意联合索引中的顺序?15.ACID是...
题目
- 1.什么是关系型数据库?
- 2.关系型数据库有什么优势?
- 3.简述什么是SQL?
- 4.什么是MySql?
- 5.简述Mysql有哪些数据类型?
- 6.Char和VarChar的区别?
- 7.Int和bigint能储存的数据大小一样吗?
- 8.InnoDB引擎的四大特性是什么?
- 9.MyISAM与InnoDB存储引擎的5大区别
- 10.说一下数据库三范式设计是什么?
- 11.SQL 语句有哪些分类?
- 12.使用 MySQL 视图有何优点?
- 13.索引是个什么样的数据结构呢?
- 14.联合索引是什么?为什么需要注意联合索引中的顺序?
- 15.ACID是什么?可以详细说一下吗?
- 16.同时有多个事务在进行会怎么样呢?
- 17.MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?
- 18.mysql有关权限的表都有哪几个?
- 19.MySQL的binlog有有几种录入格式?分别有什么区别?
- 20.什么是索引?
- 21.索引有哪些优缺点?
- 22.索引有哪几种类型?
- 23.索引的基本原理
- 24.索引设计的原则?
- 25.创建索引的原则
- 26.使用索引查询一定能提高查询的性能吗?为什么?
- 27.什么是最左前缀原则?什么是最左匹配原则?
- 28.使用B数和B+树的好处?
- 29.数据库为什么使用B+树而不是B树?
- 30.联合索引是什么?为什么需要注意联合索引中的顺序?
- 31.什么是脏读?幻读?不可重复读?
- 32.SQL 四个隔离级别分别是什么?
- 33.隔离级别与锁的关系
- 34.什么是死锁?怎么解决?
- 35.数据库的乐观锁和悲观锁是什么?怎么实现的?
- 36.视图有哪些特点?
- 37.视图的使用场景有哪些?
- 38.视图的优缺点
- 39.超键、候选键、主键、外键分别是什么?
- 40.SQL 约束有哪几种?
- 41.简述Mysql中的关联查询?
- 42.mysql中 in 和 exists 区别?
- 43.mysql中int(10)和char(10)以及varchar(10)的区别?
- 44.SQL的生命周期?
- 45.大表数据查询,怎么优化
- 46.关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
- 47.优化查询过程中的数据访问是什么?
- 48.简述优化长难的查询语句
- 49.简述优化特定类型的查询语句?
- 50.简述如何优化关联查询?
- 51.简述如何优化子查询
- 52.为什么要对数据库进行优化?
- 53.简述主从复制作用?
- 54.简述主从复制解决的问题?
- 55.数据表损坏的修复方式有哪些?
1.什么是关系型数据库?
关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解。
关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。
2.关系型数据库有什么优势?
1.易于编程。关系型二维表的结构非常贴近现实事件,二维表格,容易理解。
2.支持复杂查询。可以用SQL语句方便的在一个以及多个表之间做非常复杂的数据查询。
3.支持事务。可靠的事务并且保持事务的完整性,以便于对于安全性能很高的数据访问要求得以实现。
3.简述什么是SQL?
结构化查询语言(Structured Query Language),简称SQL。
是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
4.什么是MySql?
MySql是一种开放源代码的关系型数据库管理系统。
MySQL是最流行的关系型数据库管理系统,常见的关系型数据库还有:ORACLE、SQL SERVER、ACCESS等等。
MySQL在过去是由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,广泛的应用在internet上的中小型网站上。
5.简述Mysql有哪些数据类型?
Mysql的数据类型非常丰富,常见的类型:
整数类型:Bit、 bool、Tiny int、SMALL int、MEDIUM INT、int、bigint
浮点数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:CHAR、VARCHAR、TINY INT、TEXT、MEDIUN TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期时间类型:DATE、DATEIME、TIMESPTAMP、TIME、YEAR
其他数据类型:BINARY、VARBINARY、ENUM、SET...
6.Char和VarChar的区别?
char 是一种固定长度的类型,varchar 则是一种可变长度的类型,它们的区别是:
char 如果不指定(M)则表示长度默认是 1 个字符。varchar 必须指定(M)。
char(M)类型的数据列里,每个值都占用 M 个字符,如果某个长度小于 M,MySQL 就会在它的右边用空格字符补足
(在检索操作中那些填补出来的空格字符将被去掉;如果存入时右边本身就带空格,检索时也会被去掉);
在varchar(M)类型的数据列里,每个值只占用刚好够用的字符再加上一个到两个用来记录其长度的字节(即总长度为 L 字符+1/2 字字节)
由于某种原因 char 固定长度,所以在处理速度上要比 varchar 快速很多,但相对费存储空间。
所以对存储不大,但在速度上有要求的可以使用 char 类型,反之可以用 varchar 类型来实例。
7.Int和bigint能储存的数据大小一样吗?
不一样。
原因:int能存储四字节有符号整数,Bigint能存储8字节有符号整数。
所以存储的数据大小不一样,其中的数字10代表的知识数据的显示宽度,[^13]显示宽度指明Mysql最大可能显示的数字个数,数值的位数小于
执行的宽度时左边会用空格填充,空格不容易被看出。
如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入且能够显示出来.
建表的时候指定zerofill选项,则不足显示的部分用0填充,如果是1会显示成00000000001.
如果没指定显示宽度,bigint默认的宽度是20,int默认的宽度是11.
8.InnoDB引擎的四大特性是什么?
1.插入缓冲(insert buffer):用于非聚索引的插入和更新操作。
先判断插入的非聚集索引是否在缓冲池中,如果在则直接插入,否则插入到insert buffer对象中。
再以一定的频率进行insert buffer和辅助索引叶子节点的merge操作,将多次插入合并到一个操作中,提高对非聚集索引的插入性能。
2.二次写(double wirte)
由两部分组成,一部分是内存中double wirte buffer,大小为2MB,另一部分是物理磁盘上共享表空间连续的128个页,大小也为2MB。
在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是通过memcpy函数将脏页先复制到内存中的该区域,之后通过double wirte buffer
再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后调用fsync函数,同步到磁盘,避免操作系统缓冲写带来的问题。
3.自适应哈希索引(Adaptive hash index)
INNODB会根据访问的频率和模式,为热点页建立哈希索引,来提高查询效率。
索引通过缓冲池的B+树页构造而来,因此建立速度很快。
INNODB存储引擎会监控对表上各个索引页的查询,如果观察到建立哈希索引可以带来速度上的提升,则建立哈希索引,所以叫做自适应哈希
索引。
4.缓冲池
为了提高数据库的性能,引入缓冲池的概念.
通过参数 innodb_buffer_pool_size可以设置缓冲池的大小,参数innodb_buffer_pool_instances可以设置缓冲池的实例个数。
缓冲池主要用于存储以下内容:缓冲池中缓存的数据页类型有:
索引页、数据页、undo页、插入缓冲、自适应哈希索引、INNODB存储的锁信息(lock info)和数据字典信息。
9.MyISAM与InnoDB存储引擎的5大区别
1.INnoDB支持事务,而MYISAM不支持事务
2.INnoDB支持行级锁,而MyISAM支持表级锁
3.INnoDB支持MVCC,而MYISAM不支持
4.INNODB支持外键,而MYISAM不支持
5.INNODB不支持全文索引,而MYISAM支持
10.说一下数据库三范式设计是什么?
1.一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解(只要是关系型数据库都满足1NF)
2.二范式:2NF是对记录的唯一性约束,要求记录中有唯一标识,即实体的唯一性。
3.三范式:3NF是对字段的冗余性约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
没有冗余的数据库设计可以做到,但是,没有冗余的数据未必是最好的数据库,有时为了提高运行效率,就必须降低方式标准,适当保留冗余数据。
具体做法:在概念模型设计时遵守三范式,降低范式标准的工作放到物理数据模型设计时考虑,降低范式就是增加字段,允许冗余。
11.SQL 语句有哪些分类?
1.DDL(Data Definition Language):数据定义语言(create alter drop)
2.DML(Data Manipulation Language):数据操作语句(insert update delete select)
3.DTL:数据事务语句(commit collback savapoint)
4.DCL(Data Control Language):数据控制语句(grant revoke)
12.使用 MySQL 视图有何优点?
1.操作简单方便。视图用户完全不需要关心视图对应的表结构、关联条件、筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2.数据更加安全。视图用户只能访问视图中的结果集,通过视图可以把对表的访问权限限制在某些行和列上面。
3.数据隔离。屏蔽了源表结构变化对用户带来的影响,源表结构变化视图结构不变。
13.索引是个什么样的数据结构呢?
索引的数据结构和具体存储引擎的实现有关.
在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引.
14.联合索引是什么?为什么需要注意联合索引中的顺序?
Mysql可使用多个字段同时建立一个索引,叫做联合索引,在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序使用,否则无法命中
具体原因:
Mysql使用索引时需要索引有序,假设现在建立了name,age,school,的联合索引,那么索引的排序为:
先按照name排序,如果name相同在按照age排序,如果age相同在按照school排序.
当进行查询时,此时索引仅仅按照name严格有序,因为必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段严格
有序,此时可以使用age字段用作索引查找,一次类推,因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段
选择性高的列放在前面,此处可以根据特例的查询或者表结构进行单独的调整.
15.ACID是什么?可以详细说一下吗?
A=Atomicity
原子性,就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.
C=Consistency
系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.
I=Isolation
隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加了红色,意味着有例外情况.
D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.
16.同时有多个事务在进行会怎么样呢?
多事务的并发进行一般会造成以下几个问题:
脏读: A事务读取到了B事务未提交的内容,而B事务后面进行了回滚.
不可重复读: 当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作.
幻读: A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据.造成"幻觉".
17.MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?
从锁的类别上来讲,有共享锁和排他锁.
共享锁: 又叫做读锁. 当用户要进行数据的读取时,对数据加上共享锁.共享锁可以同时加上多个.
排他锁: 又叫做写锁. 当用户要进行数据的写入时,对数据加上排他锁.排他锁只可以加一个,他和其他的排他锁,共享锁都相斥.
用上面的例子来说就是:
用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的. 一种是真正的入住一晚,在这期间,无论是想入住的还是想看房的都不可以
锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁.
它们的加锁开销从大大小,并发能力也是从大到小.
18.mysql有关权限的表都有哪几个?
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。
这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
db权限表:记录各个帐号在各个数据库上的操作权限。
table_priv权限表:记录数据表级的操作权限。
columns_priv权限表:记录数据列级的操作权限。
host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
19.MySQL的binlog有有几种录入格式?分别有什么区别?
有三种格式,statement,row和mixed。
statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,
提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作
,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。
20.什么是索引?
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
索引的实现通常使用B树及其变种B+树。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
21.索引有哪些优缺点?
索引的优点:
- 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:
- 时间方面:创建索引和维护索引要耗费时间.
具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
- 空间方面:索引需要占物理空间。
22.索引有哪几种类型?
主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键
唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引
可以用:ALTER TABLE table_name ADD UNIQUE(column);创建唯一索引
可以用:ALTER TBALE table_name ADD INDEX index_name(c1,c2,c3);创建唯一组合索引
普通索引:基本的索引类型,没有唯一性的限制,允许为null值
可以通过ALTER TABLE t1 ADD INDEX in_name1(c1);创建普通索引
可以通过ALTER TABLE t2 ADD INDEX in_name(c1,c2,c3)L创建组合索引
全文索引:是目前搜索引擎使用的一种关键技术
可以用 ALTER TABLE t1 ADD FULLTEXT(c1);创建全文索引
23.索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询:
1.把创建了索引的列的内容进行排序
2.对排序结果生成倒排表
3.在倒排表内容上拼上数据地址链
4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
24.索引设计的原则?
1.适合索引的列是出现在where子句中的列,或者连接子句中指定的列。
2.基数较小的类,索引效果较差,没有必要在此列建立索引。
3.使用短索引。如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间。
4.不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。
在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
25.创建索引的原则
索引虽好,但也不是无限制的使用,最好符合一下几个原则
1) 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的;
如果建立(a,b,d,c)的索引则都可以用到a,b,d的顺序可以任意调整。
2)较频繁作为查询条件的字段才去创建索引
3)更新频繁字段不适合创建索引
4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)
5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
6)定义有外键的数据列一定要建立索引。
7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8)对于定义为text、image和bit的数据类型的列不要建立索引。
26.使用索引查询一定能提高查询的性能吗?为什么?
通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。
这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O。
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。
使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
基于非唯一性索引的检索
27.什么是最左前缀原则?什么是最左匹配原则?
顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,
比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的;
如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会优化成索引可以识别的形式
28.使用B数和B+树的好处?
使用B树的好处:
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。
这种特性使得B树在特定数据重复多次查询的场景中更加高效。
使用B+树的好处:
由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。
B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,
然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间
29.数据库为什么使用B+树而不是B树?
- B树只适合随机检索,而B+树同时支持随机检索和顺序检索;
- B+树空间利用率更高,可减少I/O次数,磁盘读写代价更低。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引
文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树的内部结点并没有指向关键字具体信息的指针,只是作
为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写
次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;
- B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,
其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到
叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
- B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可
以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。
- 增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
30.联合索引是什么?为什么需要注意联合索引中的顺序?
MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用
,否则无法命中索引。
具体原因为:
MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name
相同,则按照age排序,如果age的值也相等,则按照school进行排序。
当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,之后对于匹配到的列而言,其按照age字段
严格有序,此时可以使用age字段用做索引查找,以此类推。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁
或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。
31.什么是脏读?幻读?不可重复读?
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,
则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,可能是两次查询过程中间插入了一个事务更新的原有的数据
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了
新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
32.SQL 四个隔离级别分别是什么?
SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读
,但幻读仍有可能发生。
SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有事务依次逐个执行,这样事务之间就完全不可能产生干扰
,也就是说,该级别可以防止脏读、不可重复读以及幻读。
33.隔离级别与锁的关系
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突;
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
34.什么是死锁?怎么解决?
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法:
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务处理不好可以用分布式事务锁或者使用乐观锁。
35.数据库的乐观锁和悲观锁是什么?怎么实现的?
数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性
乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。
实现方式:使用数据库中的锁机制。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定
实现方式:乐一般会使用版本号机制或CAS算法实现。
两种锁的使用场景:
从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),
即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,
所以一般多写的场景下用悲观锁就比较合适。
36.视图有哪些特点?
视图的特点如下:
视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
视图是由基本表(实表)产生的表(虚表)。
视图的建立和删除不影响基本表。
对视图内容的更新(添加,删除和修改)直接影响基本表。
当视图来自多个基本表时,不允许添加和删除数据。
视图的操作包括创建视图,查看视图,删除视图和修改视图。
37.视图的使用场景有哪些?
视图根本用途:简化sql查询,提高开发效率。如果说还有另外一个用途那就是兼容老的表结构。
下面是视图的常见使用场景:
重用SQL语句;
简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;
使用表的组成部分而不是整个表;
保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;
更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
38.视图的优缺点
视图的优点:
查询简单化。视图能简化用户的操作
数据安全性。视图使用户能以多种角度看待同一数据,能够对机密数据提供安全保护
逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性
视图的缺点:
性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询
,数据库也把它变成一个复杂的结合体,需要花费一定的时间。
修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况
也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。
这些视图有如下特征:
1.有UNIQUE等集合操作符的视图。
2.有GROUP BY子句的视图。
3.有诸如AVG\SUM\MAX等聚合函数的视图。
4.使用DISTINCT关键字的视图。
5.连接表的视图(其中有些例外)
39.超键、候选键、主键、外键分别是什么?
- 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
超键包含候选键和主键。
- 候选键:是最小超键,即没有冗余元素的超键。
- 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能
为空值(Null)。
- 外键:在一个表中存在的另一个表的主键称此表的外键。
40.SQL 约束有哪几种?
NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CHECK: 用于控制字段的值范围。
41.简述Mysql中的关联查询?
六种关联查询:
交叉连接(CROSS JOIN)
内连接(INNER JOIN)
外连接(LEFT JOIN/RIGHT JOIN)
联合查询(UNION与UNION ALL)
全连接(FULL JOIN)
交叉连接(CROSS JOIN)
42.mysql中 in 和 exists 区别?
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认
为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到
表上的索引。所以无论那个表大,用not exists都比not in要快。
43.mysql中int(10)和char(10)以及varchar(10)的区别?
- int(10)的10表示显示的数据的长度,不是存储数据的大小;
chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符。
int(10) 10位的数据长度 9999999999,占32个字节,int型4位
char(10) 10位固定字符串,不足补空格 最多10个字符
varchar(10) 10位可变字符串,不足补空格 最多10个字符
- char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间
- varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,
char(10)的空格表示占位不算一个字符
44.SQL的生命周期?
1.应用服务器与数据库服务器建立一个连接
2.数据库进程拿到请求sql
3.解析并生成执行计划,执行
4.读取数据到内存并进行逻辑处理
5.通过步骤一的连接,发送结果到客户端
6.关掉连接,释放资源
45.大表数据查询,怎么优化
1.优化shema、sql语句+索引;
2.第二加缓存,memcached, redis;
3.主从复制,读写分离;
4.垂直拆分,根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;
5.水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key, 为了有好的查询效率,表结构也要
改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;
46.关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
在业务系统中,除了使用主键进行的查询,其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询
反馈给我们。
慢查询的优化首先要搞明白慢的原因是什么? 是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?
所以优化也是针对这三个方向来的:
- 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,
对语句进行分析以及重写。
- 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。
- 如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。
47.优化查询过程中的数据访问是什么?
- 访问数据太多导致查询性能下降
- 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
- 确认MySQL服务器是否在分析大量不必要的数据行
- 避免犯如下SQL语句错误
- 查询不需要的数据。解决办法:使用limit解决
- 多表关联返回全部列。解决办法:指定列名
- 总是返回全部列。解决办法:避免使用SELECT *
- 重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存
- 是否在扫描额外的记录。解决办法:
- 使用explain进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:
- 使用索引覆盖扫描,把所有的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。
- 改变数据库和表的结构,修改数据表范式
- 重写SQL语句,让优化器可以以更优的方式执行查询。
48.简述优化长难的查询语句
- 一个复杂查询还是多个简单查询
- MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
- 使用尽可能小的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的。
- 切分查询
- 将一个大的查询分为多个小的相同的查询
- 一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销。
- 分解关联查询,让缓存的效率更高。
- 执行单个查询可以减少锁的竞争。
- 在应用层做关联更容易对数据库进行拆分。
- 查询效率会有大幅提升。
- 较少冗余记录的查询。
49.简述优化特定类型的查询语句?
- count(*)会忽略所有的列,直接统计所有列数,不要使用count(列名)
- MyISAM中,没有任何where条件的count(*)非常快。
- 当有where条件时,MyISAM的count统计不一定比其它引擎快。
- 可以使用explain查询近似值,用近似值替代count(*)
- 增加汇总表
- 使用缓存
50.简述如何优化关联查询?
- 确定ON或者USING子句中是否有索引。
- 确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。
51.简述如何优化子查询
- 用关联查询替代
- 优化GROUP BY和DISTINCT
- 这两种查询据可以使用索引来优化,是最有效的优化方法
- 关联查询中,使用标识列分组的效率更高
- 如果不需要ORDER BY,进行GROUP BY时加ORDER BY NULL,MySQL不会再进行文件排序。
- WITH ROLLUP超级聚合,可以挪到应用程序处理
52.为什么要对数据库进行优化?
- 系统的吞吐量瓶颈往往出现在数据库的访问速度上
- 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢
- 数据是存放在磁盘上的,读写速度无法和内存相比
53.简述主从复制作用?
- 主数据库出现问题,可以切换到从数据库。
- 可以进行数据库层面的读写分离。
- 可以在从数据库上进行日常备份。
54.简述主从复制解决的问题?
- 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
- 负载均衡:降低单个服务器的压力
- 高可用和故障切换:帮助应用程序避免单点失败
- 升级测试:可以用更高版本的MySQL作为从库
55.数据表损坏的修复方式有哪些?
使用 myisamchk 来修复,具体步骤:
1)修复前将mysql服务停止。
2)打开命令行方式,然后进入到mysql的/bin目录。
3)执行myisamchk –recover 数据库所在路径/*.MYI
使用repair table 或者 OPTIMIZE table命令来修复,
REPAIR TABLE table_name 修复表
OPTIMIZE TABLE table_name 优化表
REPAIR TABLE 用于修复被破坏的表。
OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,
使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)
本文地址:https://blog.csdn.net/weixin_45770700/article/details/112601156