jacky自问自答-数据库
1、exists和in有什么区别?
- EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False,而In子查询则是返回具体的数据值,与指定的字段比较
- EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用
- IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。(楼主还没搞清楚原理)
2、解释下SQL UNION 和 UNION ALL 操作符?
- union和union all的都是两张或多张表查询的结果集合并起来,union会掉重复的记录,unional不会去掉重复的记录。union和union all使用的要求是两个结果集的列数据相同,数据类型相同,顺序相同
3、一张表有3个字段,性别,姓名,年龄,用一条sql查询出男的有多少条,女的有多少条?
- select sex,count(*) from 表 group by 性别
或select sum( CASE WHEN sex = '男' THEN 1 ELSE 0 END ) 男数量,sum( CASE WHEN sex = '女' THEN 1 ELSE 0 END ) 女数量 from 表
4、一张员工表,有个两个字段,分别是员工姓名和工资,假设>=1000就一级,小于1000就2级,用一条sql查询出所有员工的等级?
- SELECT 姓名,
- CASE WHEN 工资 < 1000 THEN '2'
- WHEN 工资 >= 1000 THEN '1'
- ELSE NULL END 工资等级,
- FROM Table_A
参考:http://www.cnblogs.com/prefect/p/5746624.html
https://juejin.im/post/5a6873fbf265da3e393a97fa
5、MySQL中myisam与innodb的区别?
5.1、InnoDB支持事务,而MyISAM不支持事务
5.2、InnoDB支持行级锁,而MyISAM支持表级锁
5.3、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有 使用压缩从而会造成Innodb比MyISAM体积庞大不小
5.4、InnoDB支持外键,而MyISAM不支持
5.5、InnoDB不支持全文索引,而MyISAM支持。
6、mysql主从复制的原理?
6.1、 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog日志中;
6.2、 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 日志内容,放进 自己的relay log中;
6.3、 从:sql执行线程——执行relay log中的语句;
7、在mysql索引优化方面,你有什么经验,说一说?
索引本质上是一种基于存储引擎级别的数据结构,所以不能抛开存储引擎单单谈索引的原理,如果是myisam和innodb的存储引擎都是采用B+树这种数据结构,数据表记录节点都是按照键值大小顺序存放在同一层的叶子节点上,myisam和innodb不同的是myisam存储引擎叶节点的data域存放的是数据记录的地址
参考:http://blog.csdn.net/ifollowrivers/article/details/73614549
8、在使用redis的过程中,我们往往是必须先拿到数据,根据数据进行判断,进行一些处理后,再设置数值到redis服务器中,在这过程中,你怎么保证数据安全?
可以采用乐观锁,简单的来我们每取一个数据的时候,redis不只是返回数值,还会返回这个数值对应的版本号,再设置值的到redis时,先检查版本号,再设置更新,在redis命令的表现上就是取数据,操作数据之前,先watch数据。
9、redis是单线程的,一定可以保证数据安全吗 ?一定,为什么?不一定,什么情况下不安全?什么情况下安全?
不一定
不安全的情况:比如有个两个redis连接,在并发的情况下,可能取到同一个值,比如都取到10,然后在代码中+1,预期中是12,但是实际上可能是11
安全的情况:redis自增和自减命令
10、Redis的并发竞争问题如何解决了?解Redis事务的CAS操作吗?
http://www.cnblogs.com/520playboy/p/8481935.html
缓存机器增删如何对系统影响最小,一致性哈希的实现
11、Redis持久化的几种方式,优缺点是什么,怎么实现的?
reids有两种持久化方案,分别是rdb和aof
http://www.cnblogs.com/520playboy/p/6017414.html
12、Redis的缓存失效策略?
相关知识: redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
13、缓存穿透的解决办法?
缓存穿透是查一个一定不存在的数据,可能导致数据库挂掉
解决:http://www.cnblogs.com/520playboy/p/8249942.html
14、redis集群,高可用,原理
通过主从复制,通过在从机配置,一主两从,哨兵模式,主机挂点,从机自动升级为主机
15、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
比如用户数据。数据库有2000w条。
活跃用户:
redis sortSet里 放两天内(为方便取一天内活跃用户)登录过的用户,登录一次ZADD一次,如set已存在则覆盖其分数(登录时间)。键:login:users,值:分数 时间戳、value userid。设置一个周期任务,比如每天03:00:00点删除sort set中前一天3点前的数据(保证set不无序增长、留近一天内活跃用户)。
取时,拿到当前时间戳(int 10位),再减1天就可按分数范围取过去24h活跃用户。
16、mysql索引为什么使用B+树
先从数据结构的角度来答。
B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
这就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据。
从Mysql(Inoodb)的角度来看,B+树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。
那么Mysql如何衡量查询效率呢?磁盘IO次数,提升mysql查询效率,目的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用B+树就能很好的完成这个目的,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时啊!),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。这是优点之一。
另一个优点是什么,B+树所有的Data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦
参考:https://www.cnblogs.com/xyxxs/p/4440187.html
17、数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁?
用Use SHOW INNODB STATUS来确定最后一个死锁的原因。这样可以帮助你调节应用程序来避免死锁。
http://sadwxqezc.github.io/HuangHuanBlog/mysql/2017/05/30/Innodb%E6%AD%BB%E9%94%81.html#3-工作中的另一个死锁case
18、悲观锁和乐观锁,应用中的案例,mysql当中怎么实现
https://blog.csdn.net/yifucc/article/details/79582277