• 数据库及缓存重要面试题


    1、MySQL常见数据库引擎及比较?

    InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

    MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

    Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

    注意:

      同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该
    数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

    更多数据库引擎参考:https://www.cnblogs.com/li1992/articles/9217320.html

    2、简述数据三大范式?

    第一范式(确保每列保持原子性)

    数据表中的每一列(每个字段),必须是不可拆分的最小单元。

    第二范式(确保表中的每列都和主键相关)

    第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

    第三范式(确保每列都和主键列直接相关,而不是间接相关)

    表中每一列只与主键直接相关而不是间接相关(每一列只能依赖于主键)

    3、简述触发器、函数、视图、存储过程?

    触发器:触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块

    函数:MySQL中提供了许多内置函数,还可以自定义函数(需要sql逻辑处理)

    视图:视图是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影

    存储过程:把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现(经过第一次编译后再次调用不需要再次编译,比一个个执行sql语句效率高)

    4、数据库优化方案?

    https://blog.csdn.net/jwq101666/article/details/79070773

    5、char和varchar的区别?

    char类型:定长不可变

    存入字符长度大于设置长度时,会报错;存入字符长度小于设置长度时,用空格填充剩余长度,浪费空间,但是存取速度快。

    varchar类型:可变

    不使用空格填充,在真实数据前加1-2Bytes作前缀,用来表示真实数据的字节数,节省空间,存取速度较慢。

    6、简述MySQL的执行计划?

    # explain + SQL语句
    # SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。
     'explain select * from rbac_userinfo where id=1;'

    7、1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?

    http://www.cnblogs.com/zhuifeng-mayi/p/9291446.html

    8、redis和memcached比较?

    1.存储容量:
    memcached超过内存比例会抹掉前面的数据,而redis会存储在磁盘
    2.支持数据类型:
    memcached只支持string;
    redis支持更多;如:hash、list、集合、有序集合
    3.持久化:
    redis支持数据持久化,可以将内存中的数据保持在磁盘中,memcached无
    4.主从:
    即master-slave模式的数据备份(主从)。
    5.特性
    Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,Memcached只是简单的K/V缓存

    9、redis中数据库默认是多少个db 及作用?

    #redis默认有16个db,db0~db15(可以通过配置文件支持更多,无上限)
    #并且每个数据库的数据是隔离的不能共享
    #可以随时使用SELECT命令更换数据库:redis> SELECT 1
    # 注意:
          多个数据库之间并不是完全隔离的
          比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。

    10、如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?

    # 通过scan_iter分片取,减少内存压力
    scan_iter(match=None, count=None)增量式迭代获取redis里匹配的的值
    # match,匹配指定key
    # count,每次分片最少获取个数
        r = redis.Redis(connection_pool=pool)
        for key in r.scan_iter(match='PREFIX_*', count=100000):
            print(key)

    11、redis如何实现主从复制?以及数据同步机制?

    实现主从复制:
    '创建6379和6380配置文件'
    redis.conf:6379为默认配置文件,作为Master服务配置;
    redis_6380.conf:6380为同步配置,作为Slave服务配置;
    '配置slaveof同步指令'
    在Slave对应的conf配置文件中,添加以下内容:
    slaveof 127.0.0.1 6379
    数据同步步骤:
    (1)Slave服务器连接到Master服务器.
    (2)Slave服务器发送同步(SYCN)命令.
    (3)Master服务器备份数据库到文件.
    (4)Master服务器把备份文件传输给Slave服务器.
    (5)Slave服务器把备份文件数据导入到数据库中.

    12、如何实现redis集群?

    基于【分片】来完成。

    - 集群是将你的数据拆分到多个Redis实例的过程
    - 可以使用很多电脑的内存总和来支持更大的数据库。
    - 没有分片,你就被局限于单机能支持的内存容量。
    redis将所有能放置数据的地方创建了 16384 个哈希槽。
    如果设置集群的话,就可以为每个实例分配哈希槽:
    - 192.168.1.20【0-5000】
    - 192.168.1.21【5001-10000】
    - 192.168.1.22【10001-16384】

    以后想要在redis中写值时:set k1 123
    - 将k1通过crc16的算法转换成一个数字,然后再将该数字和16384求余,
    - 如果得到的余数 3000,那么就将该值写入到 192.168.1.20 实例中。

    集群方案:
    - redis cluster:官方提供的集群方案。
    - codis:豌豆荚技术团队。
    - tweproxy:Twiter技术团队。

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

    限定Redis占用的内存,根据自身数据淘汰策略,淘汰冷数据,把热数据加载到内存。计算一下 20W 数据大约占用的内存,然后设置一下Redis内存限制即可。

    14、什么是codis及作用?

    Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说,
    连接到 Codis-Proxy(redis代理服务)和连接原生的 Redis-Server 没有明显的区别, 
    上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 
    所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

    15、什么是twemproxy及作用?

    什么是Twemproxy
    是Twtter开源的一个 Redis 和 Memcache 代理服务器,
    主要用于管理 Redis 和 Memcached 集群,减少与Cache服务器直接连接的数量。
    他的后端是多台REDIS或memcached所以也可以被称为分布式中间件。
    作用:
    通过代理的方式减少缓存服务器的连接数。
    自动在多台缓存服务器间共享数据。
    通过配置的方式禁用失败的结点。
    运行在多个实例上,客户端可以连接到首个可用的代理服务器。
    支持请求的流式与批处理,因而能够降低来回的消耗。

    16、写代码实现redis事务操作

    import redis
    pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
    conn = redis.Redis(connection_pool=pool)
    # pipe = r.pipeline(transaction=False)
    pipe = conn.pipeline(transaction=True)
    # 开始事务
    pipe.multi()
    pipe.set('name', 'zgc')
    pipe.set('role', 'haha')
    pipe.lpush('roless', 'haha')
    # 提交
    pipe.execute()
    '注意':咨询是否当前分布式redis是否支持事务

    17、什么是一致性哈希?python中是否有相应的模块?

    一致性哈希
    一致性hash算法(DHT)可以通过减少影响范围的方式,解决增减服务器导致的数据散列问题,从而解决了分布式环境下负载均衡问题;
    如果存在热点数据,可以通过增添节点的方式,对热点区间进行划分,将压力分配至其他服务器,重新达到负载均衡的状态。
    模块:hash_ring
  • 相关阅读:
    各版本mysql乱码的问题解决
    Centos+apache2.4.2+mysql5.5+php5.3.10+memcache+sphinx配置全程
    Mysql 优化
    Mysql 表优化
    Mysql 索引优化
    python整合连续数字的练习,包含itertoolsgroupby用法
    MySQL INTO OUTFILE/INFILE导出导入数据
    python lambda使用if
    mysql小知识
    Python利用urllib2抓取网页返回乱码的问题
  • 原文地址:https://www.cnblogs.com/lizhengtao/p/9990972.html
Copyright © 2020-2023  润新知