mysql数据库常见面试题

1.mysql项目里用的版本
5.7(一般是5以上,我之前的项目里用的是5.7,可以用select.version()查看数据库版本)

2.Mysql默认的事务隔离级别
是可重复读(Repeatable Read),
追问:那互联网项目中Mysql也是用默认隔离级别,不做修改么?
回答:OK,不是的,我们在项目中一般用读已提交(Read Commited)这个隔离级别!

3.mysql引擎
mysql的默认引擎是innodb(Mysql在V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB),还有个比较常用的就是mysiam性能比较好 但是不支持事务
事务安全型存储引擎,更加注重数据的完整性和安全性。

innodb 数据表,数据的写入顺序 与 存储的顺序不一致,需要按照主键的顺序把记
录摆放到对应的位置上去,速度比 Myisam 的要稍慢。
myisam: 写入数据非常快,适合使用场合官网、微博系统等写入、读取操作多的系
统。
innodb: 适合业务逻辑比较强的系统,修改操作较多的,例如办公系统、商城系统

附:
Mysql中的myisam与innodb的区别

1、InooDB支持事务,而MyISAM不支持事务
2、InnoDB支持行级锁,而MyISAM支持表级锁
3、InnoDB支持MVCC,而MyISAM不支持
4、InnoDB支持外键,而MyISAM不支持
5、InnoDB不支持全文索引,而MyISAM支持。
全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。innoDB是分段索引。比如说有1000条数据,每10条建立一个索引,分段搜索。

<2>InnoDB引擎的四大特性

插入缓冲,二次写,自适应哈希索引,预读

<3>InooDB和MyISAM的select count(*)哪个更快,为什么

myisam更快,因为myisam内部维护了一个计算器,可以直接调取。MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

4.MySQL一个表查询比较慢,怎么样加快查询速度
示例:

1.如果是单纯的想加快速度的话,可以添加索引
2.如果想要整体优化的话,可以从表的结构去优化下,表字段。还可以执行下sql语句,看它的sql语句的慢查询是个什么情况,再比方说可能就要搭建一些集群,开启一些配置,比方说是缓存,主从同步,读写分离之类的。

面试官继续追问:如果建索引的话,会增加他的插入和删除的速度吗?
我们索引的话主要增加的是查询速度,不能增加插入和删除的速度。
索引本身是为了加快对数据的读取的速度。
加快查询速度

标准:
查询效率优化

1、储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。如果不需要事务处理,使用存储引擎 MyISAM 是比较明智的
2、分表分库,主从。
3、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
4、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
5、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
6、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
7、Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
8、对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。

数据库优化

1.优化索引、SQL 语句、分析慢查询;
2.设计表的时候严格根据数据库的设计范式来设计数据库;
3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO
4.优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等
5.采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
6.垂直分表;把一些不经常读的数据放在一张表里,节约磁盘 I/O;
7.主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;
8.分库分表分机器(数据量特别大),主要的的原理就是数据路由;
9.选择合适的表引擎,参数上的优化
10.进行架构级别的缓存,静态化和分布式;
11.不采用全文索引;
12.采用更快的存储方式,例如 NoSQL 存储经常访问的数据**。

5.查所有姓曾的所有的人?或者名字里有倩,是否用索引?加like模糊查询是否使用索引?
mysql中如果用到like的关键字
like ‘%name%’ 前后%是不会用到索引的
like ‘name%’ 只加后%会用到索引的
如果要使like字段索引生效,只能后面加入%

6.事务的特性(ACID)
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。

2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。

3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即 使数据库出现故障

7.索引是帮助MySQL高效获取数据的排好序的数据结构
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
索引的实现通常使用 B+TREE。B+TREE 索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
常用的包括二叉树、红黑树、Hash、B-Tree(B树)、B+Tree(MySQL索引的真正存储结构)
MYSQL为什么最终要去选择B+TREE?

1、B+TREE是B TREE的变种,B TREE能解决的问题,B+TREE也能够解决(降低树的高度,增大节点存储数据量)
2、 B+TREE扫库和扫表能力更强,如果我们要根据索引去进行数据表的扫描,对B TREE进行扫描,需要把整棵树遍历一遍,而B+TREE只需要遍历他的所有叶子节点即可(叶子节点之间有引用)。
3、B+TREE磁盘读写能力更强,他的根节点和支节点不保存数据区,所有根节点和支节点同样大小的情况下,保存的关键字要比B TREE要多。而叶子节点不保存子节点引用。所以,B+TREE读写一次磁盘加载的关键字比B TREE更多。
4、B+TREE排序能力更强,如上面的图中可以看出,B+TREE天然具有排序功能。
5、B+TREE查询效率更加稳定,每次查询数据,查询IO次数一定是稳定的。当然这个每个人的理解都不同,因为在B TREE如果根节点命中直接返回,确实效率更高。

8.union与union的作用:
:对插叙的结果进行联合显示
union:对结果去重和排序
union all:不去重不排序
效率:union all不排序去重所以比union快

9.Redis与Mysql各自的特点、优势和缺点,并说说在项目中哪些地方使用了redis存储数据
a)Redis:
i.特点:非关系型,内存型数据库,key-value的形式存储数据,数据与数据之前无关联关系,可以指定数据保存到实体文件中,主从、集群
ii.优势:查询速度快,使用简单
iii.缺点:无法建立数据与数据之前的关系
iv.项目中的使用: 存储图片验证码,短信验证码,用户的登陆信息

b)Mysql:
i.特点:关系型,以表的形式存储数据,以表明字段的形式描述关系,主从、集群,支持查询缓存
ii.优势:能够使用表的形式将复杂的数据结构描述出来
iii.缺点:效率相较于非关系型数据库较慢,复杂的关系会导致SQL语句语法复杂

应用场景
redis:排行榜、计数器、发布订阅、缓存、消息队列
mysql:记录不同数据之间的关联关系,银行会计系统(事务的支持)

10.怎样解决数据库高并发的问题?
解决数据库高并发的常见方案:

1) 缓存式的 Web 应用程序架构:
在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数据读取速度。cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量的限制,同时增加了灵活性。

2) 增加 Redis 缓存数据库:
参考博客:https://www.cnblogs.com/Leo_wl/p/5791327.html

3) 增加数据库索引

4) 页面静态化:
效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。用户可以直接获取页面,不用像 MVC结构走那么多流程,比较适用于页面信息大量被前台程序调用,但是更新频率很小的情况。

5) 使用存储过程:
处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据库访问就可以了。

6) MySQL 主从读写分离:
当数据库的写压力增加,cache 层(如 Memcached)只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave 模式)来达到读写分离,以提高读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,而从数据库处理 select 查询,数据库复制被用于把事务性查询(增删改)导致的改变更新同步到集群中的从数据库。
MySQL 读写分离提升系统性能:
1、主从只负责各自的读和写,极大程度缓解 X 锁和 S 锁争用。
2、slave 可以配置 MyISAM 引擎,提升查询性能以及节约系统开销。
3、master 直接写是并发的,slave 通过主库发送来的 binlog 恢复数据是异步的。
4、slave 可以单独设置一些参数来提升其读的性能。
5、增加冗余,提高可用性。实现主从分离可以使用 MySQL 中间件如:Atlas

7) 分表分库:
在 cache 层的高速缓存,MySQL 的主从复制,读写分离的基础上,这时 MySQL 主库的写压力开始出现瓶颈,而数据量的持续猛增,由于 MyISAM 使用表锁,在高并发下会出现严重的锁问题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎代替 MyISAM。采用 Master-Slave 复制模式的 MySQL 架构,只能对数据库的读进行扩展,而对数据的写操作还是集中在 Master 上。这时需要对数据库的吞吐能力进一步地扩展,以满足高并发访问与海量数据存储的需求。对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】。在分表之前,首先需要选择适当的分表策略(尽量避免分出来的多表关联查询),使得数据能够较为均衡地分布到多张表中,并且不影响正常的查询。分表能够解决单表数据量过大带来的查询效率下降的问题,但是却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库 master 服务器无法承载写操作压力时,不管如何扩展 Slave 服务器都是没有意义的,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】。
8) 负载均衡集群:
将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均衡集群同时也实现了高可用性。负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。

11.CHAR与VARCHAR之间的特点与选择

CHAR和VARCHAR的区别:

CHAR是固定长度字符,VARCHAR是可变长度字符;CHAR会自动删除插入数据的尾部 空格,VARCHAR不会删除尾部空格。

CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点就是浪费 存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用 VARCHAR类型来实现。

存储引擎对于选择CHAR和VARCHAR的影响:

对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使 整个表静态化,从而使数据检索更快,用空间换时间。

对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定 长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照 实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好。

12.sql原生语句会不?
如果项目没怎么用过sql,可以试着这么回答

项目里一般django里自带orm映射 原生语句用的比较少 from django.db import models Django框架 用的时候直接就继承models.Model
“或者如果说是用户那张表的话 ,因为Django里提供里认证系统,认证系统里有用户这张表、权限(is_staff)、分组,用户表里有user_permissions”,与Permission 之间的多对多的关系。直接定义类User,继承AbstractUser,然后再配置文件settings里注册user.User就可以啦。

传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上
在Python中,最有名的ORM框架是SQLAlchemy
flask用的是SQLAlchemy,具体的实现倒不太记得了

orm是什么?
传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。
将sql语句转换为模型类对象 将模型类对象转换为sql语句

13.mysql突然宕机了怎么办?
1.检查是否有备份,事前可以利用mysqldump工具对数据进行备份和还原
2.如果备份在重启不了,可以把,就比如说你是在复制文件中突然宕机的,可以找到放数据那个文件 ,把它删掉或移动文件就可以啦。
详细见:mysql异常宕机故障数据恢复思路整理

附:
常用的mysql数据库sql语句
https://blog.csdn.net/weixin_45476498/article/details/98883467

更详细的mysql 经典面试题见:
mysql 经典面试题:
https://blog.csdn.net/weixin_42688876/article/details/81480311

持续不断更新中…

你可能感兴趣的:(mysql,python)