zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python标准模块--logging
    Spark中决策树源码分析
    常见的相似或相异程度计算方法
    mpi4py实践
    集成学习
    决策树
    git使用
    Ubuntu 14.04 64bit 安装tensorflow(GPU版本)
    KNN算法
    一致性哈希算法原理及其在分布式系统中的应用
  • 原文地址:https://www.cnblogs.com/520playboy/p/6979427.html
Copyright © 2011-2022 走看看