目录
数据库
MySQL
198.主键 超键 候选键 外键
199.视图的作用,视图可以更改么?
200.drop,delete与truncate的区别
201.索引的工作原理及其种类
202.连接的种类
203.数据库优化的思路
204.存储过程与触发器的区别
205.悲观锁和乐观锁是什么?
206.你常用的mysql引擎有哪些?各引擎间有什么区别?
Redis
207.Redis宕机怎么解决?
208.redis和mecached的区别,以及使用场景
209.Redis集群方案该怎么做?都有哪些方案?
210.Redis回收进程是如何工作的
MongoDB
211.MongoDB中对多条记录做更新操作命令是什么?
212.MongoDB如何才会拓展到多个shard里?
主键:数据库表中对存储数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null).
超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
候选键:是最小超键,即没有冗余元素的超键。
外键:在一个表中存在的另一个表的主键称此表的外键。
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by则对视图再次order by将被覆盖。
创建视图: create view xxx as xxxxxx
对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
drop直接删掉表,truncate删除表中数据,再插入时自增长id又从1开始,delete删除表中数据,可以加where字句。
1.delete 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行回滚操作。truncate table则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器,执行速度快。
2.表和索引所占空间。当表被truncate后,这个表和索引所占用的空间会恢复到初始大小,而delete操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
3.一般而言,drop>truncate>delete
4.应用范围。truncate只能对table,delete可以是table和view
5.truncate和delete只删除数据,而drop则删除整个表(结构和数据)
6.truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid.
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现通常使用B树以其变种B+树。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)
宕机:服务器停止服务‘
如果只有一台redis,肯定 会造成数据丢失,无法挽救
多台redis或者是redis集群,宕机则需要分为在主从模式下区分来看:
slave从redis宕机,配置主从复制的时候才配置从的redis,从的会从主的redis中读取主的redis的操作日志1,在redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;
2, 如果从数据库实现了持久化,此时千万不要立马重启服务,否则可能会造成数据丢失,正确的操作如下:在slave数据上执行SLAVEOF ON ONE,来断开主从关系并把slave升级为主库,此时重新启动主数据库,执行SLAVEOF,把它设置为从库,连接到主的redis上面做主从复制,自动备份数据。
以上过程很容易配置错误,可以使用redis提供的哨兵机制来简化上面的操作。简单的方法:redis的哨兵(sentinel)的功能
区别
1、redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可以用于缓存其他东西,例如图片,视频等等
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储
3、虚拟内存-redis当物流内存用完时,可以将一些很久没用的value交换到磁盘
4、过期策略-memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire设定,例如expire name 10
5、分布式-设定memcache集群,利用magent做一主多从,redis可以做一主多从。都可以一主一丛
6、存储数据安全-memcache挂掉后,数据没了,redis可以定期保存到磁盘(持久化)
7、灾难恢复-memcache挂掉后,数据不可恢复,redis数据丢失后可以通过aof恢复
8、Redis支持数据的备份,即master-slave模式的数据备份
9、应用场景不一样,redis除了作为NoSQL数据库使用外,还能用做消息队列,数据堆栈和数据缓存等;Memcache适合于缓存SQL语句,数据集,用户临时性数据,延迟查询数据和session等
使用场景
1,如果有持久方面的需求或对数据类型和处理有要求的应该选择redis
2,如果简单的key/value存储应该选择memcached.
1,codis
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据客恢复到新hash节点
2redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方介绍
3.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的字典脚本恢复,实例的监控,等等
一个客户端运行了新的命令,添加了新的数据。
redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。
一个新的命令被执行等等,所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断回收回到边界以下。
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。