Mysql----面试题整理

  1. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别
char是固定长度的字符类型,分配多少空间,就占用多长空间。
Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。
由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

  1. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。
创建索引:alert table tablename add index (字段名)

3.数据库索引有几类,分别是什么?什么时候该用索引?

普通索引、主键索引、唯一索引 并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。

4.in和or的区别

(1)in或or在字段有添加索引的情况下,查询很快,两者查询速度没有什么区别;
(2)in或or在字段没有添加索引的情况下,所连接的字段越多(1or2or3or4or…),or比in的查询效率低很多

5.Mysql默认的排序方式是什么

MyIsam存储引擎:在没有任何删除,修改的操作下,执行select不带order by那么会按照插入的顺序下进行排序。
InnDB存储引擎:在相同的情况下,select不带order by会根据主键来排序,从小到大。

6.Mysql常见的三种存储引擎

InnoDB:
支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM:
插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比
较低,也可以使用。 MEMORY:
所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
注意:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

7.Mysql字段为什么要定义为NOT NULL?

一般情况,都会设置一个默认值,不会出现字段里面有null,又有空的情况。主要有以下几个原因:
(1)索引性能不好,Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam中固定大小的索引变成可变大小的索引。
(2)如果某列存在null的情况,可能导致count() 等函数执行不对的情况。
(3)sql语句写着也麻烦,既要判断是否为空,又要判断是否为null等。

8.Mysql主键索引和普通索引之间的区别是什么

(1)普通索引(INDEX);
(2)唯一索引(UNIQUE INDEX);
(3)全文索引(FULLTEXT)(全文索引是MyISAM的一个特殊索引类型,主要用于全文检索);
(4)单列索引、多列索引;
(5)组合索引(最左前缀)。

9.数据库的三范式

第一范式:数据表中的每一个字段都是不可分割的
第二范式:数据表中的非主属性只依赖于主键
第三范式:不存在非主属性对关键字的传递函数依赖关系

10.优化mysql数据库的方法

(1)选择合适的字段数据类型
--------------1、能用数字绝不使用字符串;
--------------2、char,varchar,text 能用varchar绝不使用char
--------------3、给字段加not null 避免在表中出现NULL关键字(default 值)
(2)选择合适的字段充当主键
--------------1、建议每张表必须有主键
--------------2、用数字类型的字段充当主键
(3)拆分表
--------------1、拆分字段,将文章的标题与内容分开
--------------2、拆分记录,将今年的记录与往年的记录分开
(4)给字段合理添加索引
--------------1:普通索引(INDEX);
--------------2:唯一索引(UNIQUE INDEX);
--------------3:全文索引(FULLTEXT)
(5)建议使用innoDB存储引擎
(6)锁定表,优化事务处理

11.对于大流量的网站,您采用什么样的方法来解决访问量问题?

1、确定当前服务器设备是否满足流量需求。
2、使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
3、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
4、控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
5、使用不同的主机分流主要流量,使服务器均衡负载。
6、使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

12.说出你所知道的数据库设计范式?常用的建模工具是什么?(mysql建模工具)

(1)每一条满足原子性,不可以分割;
(2)每一条记录要满足唯一性;
(3)字段不冗余,有时我们还需要反三范式;
常用的建模工具:phpMyAdmin,navicat for mysql,DOS命令行;

13.ecshop为何出现字段冗余违犯设计模式,请说出为何这么做?

在某些环境下反三范式反而增加了效率,因此这么做!

14.常用mysql优化方式。

SQL语句优化;存储优化;数据库配置;服务器配置

15.如何最快速的插入5000条以上的数据?

先生成数据文件,再用sql语句导入

16.为什么添加索引会提高查询速度?

索引可以将无序内容转换为有序的一个集合(相对),就如同新华字典,如果没有目录,那么查询一个汉字就需要很长时间了。

17.导致索引失效的原因有哪些?

1:全值匹配意思就是联立的复合索引的顺序和个数要和检索的条件顺序和个数相同。
2:最佳左前缀法则(重要)最佳左前缀法则是指,如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列
3:不在索引列上做任何操作(计算、函数(自动或手动)类型转换),会使索引失效转为全表扫描
4:存储引擎不能使用索引中范围条件右边的列
5:尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致),减少select * 的使用
6:mysql在使用不等于(!=
或者<>)的时候无法使用索引会导致全表扫描
7:is null,is not null 也无法使用索引
8:like以通配符开头(’%abc…’)mysql索引会失效变成全表扫描的操作,(%写右边则可以避免索引失效,如果业务实在需要’%abc…%'则可以用覆盖索引避免索引失效)
9:字符串不加单引号索引会失效 10:少用or,用它连接时会索引失效

18.什么是反三范式

在进行数据库设计时,不能古板的一味迎合范式。不难看出,范式的等级越高,拆分的表就越多,查询操作也就越复杂,查询的效率也会受到影响。所以在有些时候适当降低范式标准,增加一些冗余字段,虽然会增加一些空间占用,以及对冗余数据的维护工作,但带来的效率的提升是很值得的,这就是所谓的反三范式。

19.Mysql中哪些字段适合建立索引?

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
10、比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

20.MySql在建立索引优化时需要注意的问题?

1,创建索引;
2,复合索引;
3,索引不会包含有NULL值的列;
4,使用短索引;
5,排序的索引问题;
6,like语句操作;
7,不要在列上进行运算;
8,不使用NOT IN和操作;

21.为什么MySQL要做主从复制(读写分离)?

通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。
而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。

22.为什么MYSQL要读写分离?

因为查询是对数据库服务器压力最大,查询操作很大。并且是消耗时间的。我们可以使用MySql的主从复制,让从机同步主机的数据,然后使用读写分离将查询数据丢给从机来完成,增删改就给主机完成,这样可以减少主机的压力,更好的完成项目。

23.读写分离的优点?

读写分离带来的扩展性更强; 读写分离方便管理

24.memcached与redis的区别?

1、存储方式不同。memcached把数据全部存在内存之中,断电之后会挂掉,而redis虽然也用到了内存,但是会有部分数据存在硬盘中,保证数据持久性。
2、数据支持类型不同。memcached对数据支持比较简单,而redis支持数据类型较丰富,如string、list、set、sortedset、hash。
3、底层实现不同。一般调用系统函数,会消耗比较多的时间去请求,redis自己构建了vm,速度会更快。

25.什么是索引?建立索引有什么规则?注意点?

类似一种目录表吧,dbms会实现读写,mysql在查询的时候,可以直接去查找这个目录表,就不会去扫描整个表了。有什么注意点嘛?首先我会看这个表,如果他生来就注定写多读少,尽量避免建立很多索引,因为他也会占用时间,对吧!另外在建立的时候我也会尽量建立在数字字段上,或者类似用户名上,这样做可能,在需求上作select时候不会有like或者其他计算在里面。也不要有!有的话,不要放在左值上。。。被打断!

26.什么是事务处理?

事务处理是一种机制,它是用来管理必须成批执行的mysql操作。来保证数据库不完整的操作结果。

27.事务处理中的一些术语的解释:

事务(transaction) 指一组sql语句。
回退(rollback) 指撤销指定sql语句的过程。
提交(commit)指将未存储的sql语句结果写入到数据库中。
保留点(savepoint) 指事务处理中设置的临时占位符,我们可以对他们发布回退操作。

28.数据库事务相关命令如下:

  1. 查看存储引擎:SHOW CREATE TABLE 表名;
  2. 更改引擎: ALTER TABLE 表名 ENGINE=新引擎名;
  3. 回滚: ROLLBACK;
  4. 声明事务开始: BEIGIN;
  5. 事务提交: COMMIT;
  6. 查询自动提交功能状态: SELECT @@AUTOCOMMIT;
  7. 设置自动提交功能: SET AUTOCOMMIT=0或1;
  8. 设置分离水平: SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

29.事务处理(四大)操作

  1. 原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚。
  2. 一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态。(比如拿转账来讲,假设用户A和用户B两者的钱加起来一共是2000,那么不管是用户A还是用户B之间如何转账,转几次账,事务结束后两个用户的钱加起来应该还是2000,所以这就是事务的一致性)。
  3. 隔离性:指当多个用户并发访问数据库并且操作同一张表的时候,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  4. 持久性:指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,哪怕是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

30.mysql优化

选择合适的存储引擎
字段设置为NOT NULL
字段属性越小查询越快(int enum等),
尽量使用数值型
每张表都设置主键ID(InnoDB引擎)
为字段添加索引(主键/唯一/全文/普通)
ip使用long存储

31.高访问量的网站怎么优化?

1:将不经常变化的数据,直接静态化。
2:使用redis和memcha,减少数据库的访问。
3:控制大文件的下载。
4:图片、视频服务器分离。
5:禁止外部的盗链。(可以通过refer去实现)
6:统计流量的使用情况。

32.redis默认有多少个库?

16个库

33.对于大数据访问效率你怎么处理?

首先看是否能搭建分布式环境,做主从数据库,读写分离。让replication进程实现master-slave同步。然后再考虑分表。水平、垂直分表都行。用什么算法分表看具体业务。比如比较简单主键的奇偶性。还有分表上,我建议用mysql5.1版本以上的逻辑分表功能模块,先安装partition,简单配置下,做不同磁盘的存储,减少I/O的读写

34.接触过cdn么?

接触过,是买的人家cdn,前一家公司是个社区,pv很大。这个是必须要有。

35.你们之前11台服务器怎么架构的?

最前面的这个是cdn,接下来这个是负载均衡器。后面有多个web server,每个都用的是nginx接受请求,后端用代理apache做处理。其中有一个当掉,其他服务器也会正常服务。然后这几个是主mysql服务器,后面这几个是slave。这个是图片服务器。

36.什么是CDN?适用于哪些场景?

CDN即内容分发网络,主要功能就是让在各个不同地点的网络用户请求各个不同的节点,都能够快速访问到网站提供的内容,不会经常出现等待或是卡顿的状况;
保障网络的安全:当网站访问流量过大或收到DDOS攻击时,会将多个地区的CDN节点通过负载均衡以及分布式存储技术将流量合理分散到不同的节点,防止DDOS的攻击
节约成本
场景:如国内访问较高的网站,视频直播,静态网页,大文件下载等。

37.高并发中使用了哪些技术亮点?

1.代码技术:多线程,线程池,并发库,并发队列
2.缓存技术: redis 集群 一主多从
3.数据库技术: mysql 一主多从(主从复制)读写分离 数据库单表大于2000万时,使用分库分表方案 数据库中间件 sharding-jdbc
4.前后端分离:页面静态化
5.消息队列技术: kafka rabbitMQ rocketMQ 异步消息
6.CDN技术
7:高可用实现技术:lvs + keepalived 心跳检测,故障自动剔除,服务正常自动恢复。
8:Nginx负载均衡,动静分离
9:分布式数据库

38.消息队列使用的场景有哪些?有哪几种消息队列?

1:削峰, 2:解耦, 3:异步 RabbitMQ ActionMQ RocketMQ kafka

39.redis数据类型?应用场景?什么时候用?

1、字符串(string)比如我们网站有一个需求是要求用户请求短信接口,我们需要判断用户在一分钟内不能再次发起请求,必须至少等待一分钟。因为Redis的所有键都是可以设置过期时间的,可以完全实现目前Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。
2 、哈希(hash )哈希类型最典型的一个应用,就是作为Session的替换方案,在单机服务器的时候我们可能没有感觉到Session的潜在问题,可是如果日后业务发展加快,需要水平扩展服务器的时候(负载均衡),Session共享就会成为一个问题,虽说nginx有根据IP分发请求的策略,但不是最优解,我们最理想的是可以实现所有Session的集中管理。
3 、队列(list)队列算是Redis的一大核心特色吧,在短时间内流量聚集非常集中的时候(比如秒杀、抢购活动),数据的入库往往是个问题,短时间的数据几种入库分分钟让数据库宕机,结合Redis的队列,我们可以解决两个问题:产品超卖,数据库宕机等
4、集合(set)交集、并集、差集,都是这些基本原理的应用。比如说你微博关注的人,我微博关注的人,现在求我们俩共同的关注好友,怎么求?
这个时候可以理一下思路,把问题转化成,求你跟我关注的好友”范围“的交集。 那不就是两个集合的交集?
5 有序集合(sortedset)这个用得可能要比集合(set)要多一点,它的好处在于集合中每一个成员都有一个分数(score)分数是不是有高低啊?分数是不是可以排序啊?这个就类似排行榜之类的,从这些介绍中我们可以看到Redis的五种基础数据类型各有特色,可以轻松使用于不同的场景需求,比起单一的string类型的Memecache,Redis必然成为大热之选。

40.为什么要使用数据库

数据保存在内存
---------优点:存取速度快
---------缺点:数据不能永久保存
数据保存在文件
---------优点:数据永久保存
---------缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便
数据保存在数据库
1)数据永久保存
2)使用SQL语句,查询方便效率高。
3)管理数据方便

41.索引有哪些优缺点

索引的优点
-----可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
-----通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
-----时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
-----空间方面:索引需要占物理空间。

42.百万级别或以上的数据如何删除

关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。
1、所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)
2、然后删除其中无用数据(此过程需要不到两分钟)
3、删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。
4、与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。

43、mysql为什么要分库分表

单表操作数据量有最优值,mysql为1000万左右;可以减轻数据库的压力,不用所有线程都查同一个数据库;数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

44.如果分库分表的情况下碰到要对一个表或多个表关联并且按多个字段为条件进行检索的情况下怎么办呢?

(1)前端用户侧业务,流量大,并发大,join真的很少,58同城用户库几亿数据,帖子库300亿数据,没有join。
(2)如果真要join,分库后冗余数据、索引表、分页,for循环低效查询 ->
总能解决的,只是看性能是不是主要矛盾、一致性是不是主要矛盾了。
(3)拆成小sql是互联网的玩法,互联网很少用join、子查询、视图、外键、用户自定义函数、存储过程的。当然,我指面向用户侧的高并发业务。

45、设定网站用户数量在千万级,但是活跃用户数量只有1%,如何通过优化数据库提高活跃用户访问速度?

(1)可以使用MySQL的分区,把活跃用户分在一个区,不活跃用户分在另外一个区,本身活跃用户区数据量比较少,因此可以提高活跃用户访问速度。
(2)还可以水平分表,把活跃用户分在一张表,不活跃用户分在另一张表,可以提高活跃用户访问速度。

46、分库分表之后,id 主键如何处理

(1)数据库自增 id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id。拿到这个 id之后再往对应的分库分表里去写入。
(2)设置数据库 sequence 或者表自增字段步长可以通过设置数据库 sequence
或者表的自增字段步长来进行水平伸缩。

47、现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?

双写迁移方案。同时写俩库,老库和新库。然后系统部署之后,新库数据差太远,用之前说的导数工具,跑起来读老库数据写新库,写的时候要根据gmt_modified这类字段判断这条数据最后修改的时间,除非是读出来的数据在新库里没有,或者是比新库的数据新才会写。导完一轮之后,有可能数据还是存在不一致,那么就程序自动做一轮校验,比对新老库每个表的每条数据,接着如果有不一样的,就针对那些不一样的,从老库读数据再次写。反复循环,直到两个库每个表的数据都完全一致为止。

48、你们具体是如何对数据库如何进行垂直拆分或水平拆分的?

一般来说,垂直拆分,你可以在表层面来做,对一些字段特别多的表做一下拆分;水平拆分,你可以说是并发承载不了,或者是数据量太大,容量承载不了,拆了,按什么字段来拆。分表,你如果哪怕是拆到每个库里去,并发和容量都ok了,但是每个库的表还是太大了,那么你就分表,将这个表分开,保证每个表的数据量并不是很大。

49、分库分表的拆分方式有?他们分别主要解决什么问题?

(1)水平切分,主要解决单表过大造成的性能问题,单表过大造成的单服务器空间问题。
(2)垂直切分,主要解决表与表之间资源争用问题,锁争用机率小,实现核心与非核心的分级存储,如UDB登陆库拆分成一级二级三级库,数据库同步压力问题。

50、目前准备做数据库水平切分,需要注意什么关键问题?目前了解需要避免跨库事务。

(1)需要注意分库patition key的选取,要保证两个均衡:数据量的均衡,请求量的均衡。
(2)库后,需要注意分之前用SQL满足的需求是否还能满足,需要怎么改进满足,例如max, min, avg,sum都需要在服务层再做一次聚合。
(3)夸库事务,分布式事务,在吞吐量是主要矛盾的互联网场景,目前没有能够很好解决的方案,尽量避免。

51、什么是 Redis 穿透和雪崩

缓存穿透:就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询.如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了.
---------解决办法是:每次从数据库中查询到一个不存在的key的时候,就写一个空值到缓存库中,有恶意攻击的时候,直接从缓存中取到这个空值.
缓存雪崩:就是每秒有5000个请求过来时候,redis缓存库崩了,然后这些请求瞬间落在了mysql数据库上,直接导致数据库死机.
---------解决方案就是: 事前:提高缓存库的高可用, 使用主从结构加哨兵 cluster集群,事中:使用ehcache+hystrix限流组件(当请求量非常巨大的时候,就调用自己开发好的一个降级饿组件,返回一些默认值,如友情提示,或者空白值)事后:做持久化,尽快恢复缓存集群,一旦恢复,自动从磁盘上读取数据,恢复内存中的数据.

52、memcache或redis雪崩如何解决?

造成原因:通常,在一个网站里,mysql数据库处理的请求比较少(20%),负载80%,缓存技术处理大多数请求(80%)
如果memcache或redis挂掉,所有请求都会在mysql处理,数据库的处理能力不足会直接宕机。这时候就算重启缓存和mysql也是无济于事的,因为缓存重启后,数据已经丢失,数据请求还是会走mysql,mysql还是会死掉(死循环)
解决方法:缓存预热
1:先启动缓存,再启动数据库。(但是此时不提供对外服务)
2:通过一个PHP脚本把常用的key写入缓存中
3:开放对外服务【热点数据已经缓存,请求会被缓存处理,减轻mysql压力】

53、两台mysql服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的

不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
如果是核心业务的话,现在所有的写操作都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。 备机的数据不一致怎么办?你要勇敢怼回去,你们每秒多少写入操作。按照百万级表,每秒1000的写入效率,正常的设计是,分布在2台机器上每台500。这个级别的数据同步,出现差异的概率
可以忽略不计的。有一台出现问题,另一台也可以抗住。

54、为什么要用Redis?

因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有
Redis 和 Memcached 不过中和考虑了他们的优缺点,最后选择了Redis。

55、Reids的特点?

----------Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。
----------Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。
----------Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

56、使用过Redis分布式锁么,它是什么回事?

先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

57、如果有大量的key需要设置同一时间过期,一般需要注意什么?

如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。

58、Redis的同步机制了解么?

Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

59、是否使用过Redis集群,集群的原理是什么?

Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

60、mysql数据库中的事务有什么作用,为什么要有事务的隔离级别?请列举事务的隔离级别?

原子性,隔离性,持久性,一致性
因为事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。所以设立了几种事务隔离级别。
------1、DEFAULT :默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别。顺便说一句,如果使用的MySQL,可以使用"select@@tx_isolation"来查看默认的事务隔离级别
------2、READ_UNCOMMITTED:读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
------3、READ_COMMITED:读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
------4、REPEATABLE_READ:重复读取,即在数据读出来之后加锁,类似"select * from XXX for
update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
------5、SERLALIZABLE串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了

61、Redis的特点

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB.

62、Redis常见性能问题和解决方案?

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

63、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。
redis 提供 6种数据淘汰策略:
1、volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
2、volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
3、volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
4、allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5、allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6、no-enviction(驱逐):禁止驱逐数据

64、Redis的缓存策略和主键失效机制

作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.
在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。

65、谈谈你在写sql语句需要注意有哪些点?

1、select * 问题,客户端需要什么,就给什么,不要给多余的字段,这种情况可能还会导致本来可以走覆盖索引的语句不能走覆盖索引。
2、不要在查询语句字段上做函数运算,这样会让索引失效。
3、一定要避免mysql自动类型转换,比如 where ‘9’ =9。
4、能不设置允许 null 的字段尽量不要设置,因为 null 会导致 mysql 多一层判断。
5、使用 like 的时候如果是通配符 %在最前面的话也会走的全表扫描。

66、把你知道的关于索引的一些技巧说下

1、要在区分度高的字段上建立索引,否则索引意义不大。
2、字符串建立索引要注意大小,索引长度过长,占用的空间也就越大,适当的可以截取进行索引,缺点是不能使用到覆盖索引,具体根据业务合理安排。
3、建立联合索引要知道最左前缀原则,举个例子( name, email, phone ),最终能走这个联合索引的一定只会是 ( name),( name, email ),( name, email, phone ),其他只能走全表,需要根据业务合理设置联合索引的顺序。

67、索引底层是什么数据结构?

B+树

68、为什么用的是B+树,不能使用红黑树或者其他的?

可以使用红黑树。但是这样的话可能会造成树的高度过高,意味着相同查询下,会进行更多的磁盘I/O,影响性能,而 B+树可以保持树的高度不至于过高。

69、你知道索引下推吗?

本质上是对普通索引需要回表的一种优化,也就是引擎层在对索引指针遍历的过程中,先做一些优先的判断,过滤掉不符合条件的,可以减少磁盘IO。

70、假设现在有人操作数据库,不小心执行错了语句,误删除了很多数据,这时候能恢复吗?怎么恢复?

首先,一定要开启 bin-log ,如果没有开启的话,可能就恢复不了。要看具体的文件系统是否能恢复。开启了 bin-log,类型设置要设置成 row 或者 mixed ,不能设置 statement。然后,如果是误删行的话,就可以把里面对应的删除事件换成插入事件,在备用库上执行。如果是误删表的话,可以先获取最近的一次全量备份,放到备库,然后拿出bin-log , 除了不执行删除的事件,其他事件依次重放。

71、为什么不能设置成 statement ?

设置成 statement ,实际 bin-log 存储的是 sql 语句( 非具体删除的主键id),这样如果是主从架构的话,主和从可能因为选择的索引不一样而导致主从不一致。

72、你知道什么是覆盖索引和回表吗?

覆盖索引指的是在一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,而不再需要回表查询。而要确定一个查询是否是覆盖索引,我们只需要explain sql语句看Extra的结果是否是“Using index”即可。如下所示:
explain select * from user where age=1; //查询的name无法从索引数据获取
explain select id,age from user where age=1; //可以直接从索引获取

73、锁的类型有哪些呢?

mysql锁分为共享锁和排他锁,也叫做读锁和写锁。
读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写。
写锁是排他的,它会阻塞其他的写锁和读锁。从颗粒度来区分,可以分为表锁和行锁两种。
表锁会锁定整张表并且阻塞其他用户对该表的所有读写操作,比如alter修改表结构的时候会锁表。
行锁又可以分为乐观锁和悲观锁,悲观锁可以通过for update实现,乐观锁则通过版本号实现。

74、那分表后的ID怎么保证唯一性的呢?

1、设定步长,比如1-1024张表我们分别设定1-1024的基础步长,这样主键落到不同的表就不会冲突了。
2、分布式ID,自己实现一套分布式ID生成算法或者使用开源的比如雪花算法这种
3、分表后不使用主键作为查询依据,而是每张表单独新增一个字段作为唯一主键使用,比如订单表订单号是唯一的,不管最终落在哪张表都基于订单号作为查询依据,更新也一样。

75、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

1、如果标的类型是MylSAM,name就是18;
2、如果表的类型是InnoDB,则是15,因为InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失

76、MySQL的技术特点是什么?

MySQL数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的多线程SQL服务器、不同的后端、广泛的应用程序编程接口和管理工具。

77、你怎么理解操作系统里的内存碎片,有什么解决办法?

----------内存碎片分为内部碎片和外部碎片。
----------内部碎片和外部碎片的最明显的区别就是内部碎片能明确指出这部分内存是属于哪个进程的,而外部碎片不属于任何进程。
----------内部碎片是指已经被分配给某个进程、但是该进程却使用不到的内存空间,只有当该进程运行完毕后才能释放这块内存空间给其他进程使用。
----------外部碎片指的是在内存分配过程当中产生的不可被利用的、已申请内存之间的内存空间。外部碎片往往数量比较多,而且每块碎片都很小。
----------现在的解决方法主要有以下两种:
----------1.段页式内存分配机制。先根据编程需求将内存分为不同的段,然后在段内再基于页框进行内存分配。
----------2.伙伴系统。维护11个链表,各链表存放2的整数倍的页框块,换言之,第一个链表专门将规模为1个页框的块串连起来,第二个链表专门将规模为2个页框的块串连起来,以此类推,第十一个链表专门将规模为1024个页框的块串连起来。每次进程申请内存时,就从比申请内存规模大的链表中拆出指定内存,将被拆解的块中的剩余部分再进行拆解并插入到指定链表中。

猜你喜欢

转载自blog.csdn.net/zhouqi1427/article/details/115055710
今日推荐