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