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只有在主键和外键的数据类型相同时才能使用索引,否则及时建立了索引也不会使用;
四种隔离级别
-
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
-
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
-
Read committed (读已提交):可避免脏读的发生。
-
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将变成一个纯内存数据库。