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

jacky自问自答-数据库的更多相关文章

  1. jacky自问自答-java并发编程

    1.java Web中线程不是由tomcat这类web容器负责的吗?为什么还要我控制多线程? 答:这个问题很多初学者都会有的疑惑,举一个我以前做的一个需求,java作为中间平台,是socket服务端, ...

  2. 区块链自问自答 day1

    区块链自问自答 day1 简要介绍区块链是什么? 区块链(Blockchain)是一种对等网络下的分布式数据库系统 ​ 数据结构中的单向链表是通过每个节点包含一个节点的指针实现"链" ...

  3. [python]自问自答:python -m参数?

    python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  4. 自问自答之VR遐想

    先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...

  5. [python]自问自答:python -m参数? (转)

    python -m xxx.py 作用是:把xxx.py文件当做模块启动但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  6. [python]自问自答:python -m参数? (转) ( python2.7 版本 )

    原文地址: http://www.cnblogs.com/xueweihan/p/5118222.html python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当 ...

  7. css自问自答(二)

    css自问自答(二) 7.掌握定位的一些属性 position 和 display 属性,以及如何浮动(float)和清除(clear)元素,z-index属性 三个属性控制: position 属性 ...

  8. css自问自答(一)

    css自问自答(一) 1.块级元素和行内元素特性与区别? 块级:display:block <div>.<p>.<h1>...<h6>.<ol&g ...

  9. vue 源码自问自答-响应式原理

    vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...

随机推荐

  1. 转:【HTTP】常见错误码说明

    一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 ...

  2. HDUOJ----4004The Frog's Games(二分+简单贪心)

    The Frog's Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) ...

  3. HDUOJ---1195Open the Lock

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. 【LeetCode】39. Combination Sum (2 solutions)

    Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...

  5. js 排序

    在本例中,我们将创建一个数组,并按字母顺序进行排序: <script type="text/javascript"> var arr = new Array(6) ar ...

  6. NSUserDefault 的使用

    1.NSUserDefault的使用: 作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等 ...

  7. Python练习笔记——计算输入日期为改年的第几天、星期几

    # 输入年月日,如:1995年12月10日,计算是该年的第几天?# 同时计算出当天是星期几? print("请依据提示依次输入您想查询的年 月 日") # 第一段代码块(年月日输入 ...

  8. Android 中 values/strings.xml 取值

    <string name="smsphone_init">15898146863</string> //取值 String strSmsPhone=getR ...

  9. PLSQL_标准删除的方式Delete/Drop/Truncate区别和比较(概念)

    2014-06-02 Created By BaoXinjian

  10. .net利用SQLBulkCopy进行数据库之间的大批量数据传递

    SQLBulkCopy,用于数据库之间大批量的数据传递.通常用于新,旧数据库之间数据的更新.即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来. 首先,SQLBulkCopy需要2个连 ...