后端mysql_后端数据库攻略(⼀)MySQL基础考点
1.事务的原理 特性及并发控制
什么是事务(Transaction)?
c编程实例100篇事务是数据库并发控制的基本单位
事务可以看作是⼀些列SQL语句的集合
事务必须要么全部执⾏成功,要么全部执⾏失败(回滚)
事务使⽤常见的场景:银⾏转账操作
事务的ACID特性
原⼦性(Atomicity):⼀个事务中所有操作全部完成或失败
⼀致性(Consistency):事务开始和结束之后数据完整性没有被破坏
隔离性(Isolation):允许多个事务同时对数据库修改和读写
持久性(Durability):事务结束之后,修改是永久的不会被丢失
事务并发控制
可能产⽣哪些问题?
幻读:⼀个事务第⼆次查出现第⼀次没有的结果
mysql面试题acid⾮重复读:⼀个事务重复读两次得到不同的结果
脏读:⼀个事务读取到另⼀个事务没有提交的修改
丢失修改:并发写⼊造成其中⼀些修改丢失
解决并发异常,定义4种事务隔离级别
读未提交:别的事务可以读取到未提交改变
读已提交:只能读取已经提交的数据
可重复读:同⼀个事务先后查询结果⼀样(Mysql innoDB默认实现可重复读级别)
串⾏化: 事务完全串⾏化执⾏,隔离级别最⾼,效率最低
如何解决⾼并发场景下的插⼊重复(写⼊数据库会出现重复问题)
使⽤数据库的唯⼀索引
使⽤队列异步写⼊
使⽤redis等实现分布式锁
乐观锁和悲观锁
悲观锁:先获取锁再进⾏操作。⼀锁⼆查三更新 select for update
乐观锁:先修改,更近的时候发现数据已经变了就回滚(check and set)
使⽤需要根据响应速度、冲突频率、重试代价来判断使⽤哪⼀种
2.常见字段的含义及区别
⽂本型
CHAR
VARCHAR
TINYTEXT
TEXT
数值型
TINYINT
SMALLINT
INT
SIGINT
FLOAT
DOUBLE
⽇期和时间
DATE
DATETIME
TIMESTAMP (4个字节,但接受的时间1970-2038年之间) 3.常见数据库引擎之间的区别(InnoDB VS MyISAM) MyISAM不⽀持事务,InnoDB⽀持事务
MyISAM不⽀持外键,InnoDB⽀持外键
MyISAM只⽀持表锁,InnoDB⽀持⾏锁和表锁
MyISAM⽀持全⽂索引,InnoDB不⽀持
(⼆)Mysql索引原理及优化常见考题
1. 索引的原理、类型、结构
什么是索引?
数据表种⼀个或者多个列进⾏排序的数据结构
spring另一个意思索引能够⼤幅提升索引速度
创建、更新索引本⾝也会消耗空间和时间
什么是B-Tree?(查结构进化史)
多路平衡查树
B+Tree
flash游戏下载网站Mysql实际使⽤的B+Tree作为索引的数据结构
2. 创建索引的注意事项,使⽤原理
常见索引类型
普通索引 CREATE INDEX
唯⼀索引,索引列的值必须唯⼀ CREATE UNIQUE INDEX
多列索引(联合索引)
主键索引 ⼀个表只能有⼀个 PRIMARY KEY
全⽂索引 InnoDB不⽀持(⼀般采⽤专门的全⽂索引数据库实现)
什么时候创建索引?(建表的时候需要根据查询需求来创建索引)
经常⽤作查询条件的字段(WHERE条件)
经常⽤作表连接的字段
经常出现在order by, group by之后的字段
创建索引有哪些需要注意的?(最佳实践)
⾮空字段NOT NULL, Mysql很难对空值做查询优化
区分度⾼,离散度⼤,作为索引的字段值尽量不要有⼤量相同值
索引的长度不要太⼤(⽐较消耗时间--索引作为B+Tree的key值存在,字符串key太长⽐较耗时)
索引什么时候失效?
记忆⼝诀:模型匹配、类型隐转、最左匹配
以%开头的LIKE语句,模糊搜索
出现隐式转换(python这种动态语⾔查询中需要注意)
没有满⾜最左前缀原理(针对联合索引)
什么聚集索引和⾮聚集索引
是指B+Tree叶节点存的是指针还是数据记录
MyISAM索引和数据分离,使⽤的是⾮聚集索引(存的是数据指针)
InnoDB数据⽂件就是索引⽂件,主键索引就是聚集索引
3.如何排查和消除慢查询
慢查询通常是缺少索引,索引不合理或者业务代码实现导致
排查
slow_query_log_file开启并且查询慢查询⽇志
通过explain命令排查索引问题
调整数据修改索引;业务代码层限制不合理访问(⽐如⼀次获取太多数据--实现分页; 数据类型不匹配导致全⽂扫描)
(三)SQL语句编写常考题
1.常⽤连接为重点
内连接(INNER JOIN):两个表都存在匹配时,才会返回匹配⾏
外连接(LEFT/RIGHT JOIN): 返回⼀个表的⾏,即使另⼀个没有匹配
全连接(FULL JOIN):只要某⼀个表存在匹配就返回
(四)⾮关系型数据库Redis
1. 缓存(内存缓存)的使⽤场景
为什么要使⽤缓存?
缓解关系数据(常见的Mysql)并发访问的压⼒: 热点数据
减少响应时间:内存IO速度⽐磁盘快
提升吞吐量: Redis等内存数据库单机就可以⽀持很⼤并发
Redis和Memcached主要区别?
数据存储类型:redis⽀持string/List/hash/set/sort set;memcached只⽀持⽂本型/⼆进制类型⽹络IO模型:redis单进程模式;memcached多线程、⾮阻塞IO模式
持久化⽀持:redis⽀持两种RDB,DOF; memcached不⽀持
2. Redis常⽤数据类型和使⽤场景?
数据类型
String(字符串):⽤来实现简单的KV键值对存储,⽐如计数器
List(链表): 实现双向链表,⽐如⽤户的关注,粉丝列表
Hash(哈希表):⽤来存储彼此相关信息的键值对
Set(集合): 存储不重复元素,⽐如⽤户的关注者
Sorted set(有序集合): 实时信息排⾏榜
⽀持两种⽅式实现持久化
快照⽅式:把树快照放在磁盘⼆进制⽂件中,dump.rdb
AOF: 每⼀个写命令追加到appendonly.aof中
可以修改通过Redis配置实现
什么redis事务?
将多个请求打包,⼀次性,按序执⾏多个命令的机制
通过 MULTI, EXEC,WATCH等命令实现事务功能
如何实现分布式锁?
使⽤setnx实现加锁,可以同时通过expire添加超时时间
c语言指数函数怎么用锁的value值可以使⽤⼀个随机的uuid或者特定的命名
释放锁的时候,通过uuid判断是否是该锁,是则执⾏delete释放锁
3. 缓存使⽤的坑
使⽤缓存的模式?
Cache Aside: 同时更新缓存和数据库
Read/Write Through: 先更新缓存,缓存负责同步更新数据库
Write Behind Caching: 先更新缓存,缓存定期异步更新数据库
如何解决缓存穿透问题?
原因:由于⼤量缓存查不到就去数据库取,数据库也没有要查的数据
解决:对于没有查到返回None的数据也缓存; 插⼊数据的时候删除相应缓存,或者设置较短的超时时间如何解决缓存击穿问题?
原因:某些⾮常热点的数据key过期,⼤量请求达到后端数据库
解决:
分布式锁-获取锁的线程从数据库拉数据更新缓存,其他线程等待
异步后台更新-后台任务针对过期key⾃动刷新
如何解决缓存雪崩问题?
原因:缓存不可⽤或⼤量缓存key同时失效,⼤量请求直接达到数据库
解决:
多级缓存--不同级别的key设置不同的超时时间
随机超时--key的超时时间随机设置,防⽌同时超时
架构层--提升系统可⽤性,监控、报警完善
(五)Mysql与Redis练习题
1. Mysql思考题
为什么Mysql数据库主键使⽤⾃增的整数⽐较好?uuid可以吗?
在最佳实践中,auto_increment字段长度⽐uuid⼩,从性能及可读性都⽐uuid要好
如果是分布式系统下我们怎么⽣成数据库的⾃增id呢?
在auto_increment的基础上,设置step增长步长;⽐如:Master1 ⽣成的是 1,4,7,10,Master2⽣成的是2,5,8,11 Master3⽣成的是 3,6,9,12。
这样就可以有效⽣成集中的唯⼀ID,也可以⼤⼤降低ID⽣成数据库操作的负载。
2. Redis应⽤-分布式锁
编写⼀个简单的分布式锁,要求⽀持超时时间参数
import time
import redis
汉翻英文在线翻译class RedisLock(object):
def __init__(self, key, timeout):
self.rdcon = redis.Redis(host='', port=6379, password="", db=1)
self._lock = 0
self.timeout = timeout
self.lock_key = "%s_dynamic_test" % key
@staticmethod
def get_lock(cls):
while cls._lock != 1:
timestamp = time.time() + self.timeout + 1
cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp)
# 注意下⽅括号的范围
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论