zoukankan      html  css  js  c++  java
  • 2020面试

    问题:

    mysql

    MySQL主要的索引类型

    普通索引:是最基本的索引,它没有任何限制;

    唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;

    主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;

    组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;

    全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持;

    MySQL联合索引

    1、联合索引是两个或更多个列上的索引。

    对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。

    例如索引是key index (a,b,c). 可以支持a 、 a,b 、 a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

    2、利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。

    复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。

    如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不知道姓,电话簿将没有用处。

    使用索引注意事

    使用like 'a%' 、like'%a'、like'%a%'查询时是否会使用索引答:'a%'会,其他两个不会;

    索引不会包含有NULL的列,复合索引中只要有一列含有NULL值,那么这一列对于此符合索引就是无效的;

    使用短索引,对串列进行索引,如果可以就应该指定一个前缀长度;

    短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作;

    mysql查询只使用一个索引,因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引;

    注意like,上文已经提到;

    不要在列上进行运算;

    不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的;

    索引要建立在经常进行select操作的字段上;索引要建立在值比较唯一的字段上;

    对于那些定义为text、image和bit数据类型的列不应该增加索引;

    在where和join中出现的列需要建立索引;

    如果where字句的查询条件里使用了函数(如:where DAY(column)=…),mysql将无法使用索引;

    在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用;

    四种隔离级别

    1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

    2. Repeatable read (可重复读):可避免脏读、不可重复读的发生。

    3. Read committed (读已提交):可避免脏读的发生。

    4. Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    MySQL中myisam与innodb的区别,至少5点
    (1)、问5点不同

    1.InnoDB支持事物,而MyISAM不支持事物
    2.InnoDB支持行级锁,而MyISAM支持表级锁
    3.InnoDB支持MVCC, 而MyISAM不支持
    4.InnoDB支持外键,而MyISAM不支持
    5.InnoDB不支持全文索引,而MyISAM支持。
    6.InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持
    7.InnoDB表支持多种行格式, myisam 不支持
    8.InnoDB是索引组织表, myisam 是堆表

    (2)、innodb引擎的4大特性

    1.插入缓冲(insert buffer)
    2.二次写(double write)
    3.自适应哈希索引(ahi)
    4.预读(read ahead)

    (3)、各种不同 mysql 版本的Innodb的改进

    MySQL5.6 下 Innodb 引擎的主要改进:
    ( 1) online DDL
    ( 2) memcached NoSQL 接口
    ( 3) transportable tablespace( alter table discard/import tablespace)
    ( 4) MySQL 正常关闭时,可以 dump 出 buffer pool 的( space, page_no),重启时 reload,加快预热速度
    ( 5) 索引和表的统计信息持久化到 mysql.innodb_table_stats 和mysql.innodb_index_stats,可提供稳定的执行计划
    ( 6) Compressed row format 支持压缩表
    
    MySQL 5.7 innodb 引擎主要改进
    ( 1) 修改 varchar 字段长度有时可以使用 online DDL
    ( 2) Buffer pool 支持在线改变大小
    ( 3) Buffer pool 支持导出部分比例
    ( 4) 支持新建 innodb tablespace,并可以在其中创建多张表
    ( 5) 磁盘临时表采用 innodb 存储,并且存储在 innodb temp tablespace 里面,以前是 myisam 存储
    ( 6) 透明表空间压缩功能

    (4)、2者select  count(*)哪个更快,为什么

    myisam更快,因为myisam内部维护了一个计数器,可以直接调取。

    (5)、2 者的索引的实现方式

    都是 B+树索引, Innodb 是索引组织表, myisam 是堆表, 索引组织表和堆表的区别要熟悉

    备份计划

    视库的大小来定,一般来说 100G 内的库,可以考虑使用 mysqldump 来做,因为 mysqldump更加轻巧灵活,备份时间选在业务低峰期,可以每天进行都进行全量备份(mysqldump 备份
    出来的文件比较小,压缩之后更小)。100G 以上的库,可以考虑用 xtranbackup 来做,备份速度明显要比 mysqldump 要快。一般是选择一周一个全备,其余每天进行增量备份,备份时间为业务低峰期。

    (2)、备份恢复时间

    物理备份恢复快,逻辑备份恢复慢
    这里跟机器,尤其是硬盘的速率有关系,以下列举几个仅供参考
    20G的2分钟(mysqldump)
    80G的30分钟(mysqldump)
    111G的30分钟(mysqldump)
    288G的3小时(xtra)
    3T的4小时(xtra)
    逻辑导入时间一般是备份时间的5倍以上

    (3)、备份恢复失败如何处理

    首先在恢复之前就应该做足准备工作,避免恢复的时候出错。比如说备份之后的有效性检查、权限检查、空间检查等。如果万一报错,再根据报错的提示来进行相应的调整。

    redis:

    淘汰策略有:

      4.1.volatile-lru:从已经设置过期时间的数据集中,挑选最近最少使用的数据淘汰

      4.2.volatile-ttl:从已经设置过期时间的数据集中,挑选即将要过期的数据淘汰

      4.3.volatile-random:从已经设置过期时间的数据集中,随机挑选数据淘汰

      4.4.allkeys-lru:从所有的数据集中,挑选最近最少使用的数据淘汰

      4.5.allkeys-random:从所有的数据集中,随机挑选数据淘汰

      4.6.no-enviction:禁止淘汰数据

    持久化

    Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

    RDB

    简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本。如果系统发生故障,将会丢失最后一次创建快照之后的数据。如果数据量大,保存快照的时间会很长。

    AOF

    换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。将写命令添加到 AOF 文件(append only file)末尾。

    使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。选项同步频率always每个写命令都同步,eyerysec每秒同步一次,no让操作系统来决定何时同步,always 选项会严重减低服务器的性能,everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器几乎没有任何影响。no 选项并不能给服务器性能带来多大的提升,而且会增加系统崩溃时数据丢失的数量。随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。

    其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库。

  • 相关阅读:
    怎样把顶级控件加在另一个控件上?
    GML规范相关资源
    VB6.0的事件、回调函数等
    [转]使用ErrorProvider改善用户体验
    今日新增3D词汇
    [转]在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)
    [翻译]Windows Phone 7 Application Controls
    转帖Windows Phone 7开发环境搭建
    利用SDF2.3获取Windows Mobile上的IP地址和MAC地址
    “2010 GCR MVP Open Day”之行
  • 原文地址:https://www.cnblogs.com/zmjc/p/12419969.html
Copyright © 2011-2022 走看看