当前位置:首页 > 文章列表 > 数据库 > MySQL > 后端数据库攻略

后端数据库攻略

来源:SegmentFault 2023-02-20 11:57:59 0浏览 收藏

数据库小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《后端数据库攻略》带大家来了解一下后端数据库攻略,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!

(一)MySQL基础考点

1.事务的原理 特性及并发控制

什么是事务(Transaction)?

事务是数据库并发控制的基本单位
事务可以看作是一些列SQL语句的集合
事务必须要么全部执行成功,要么全部执行失败(回滚)
事务使用常见的场景:银行转账操作

        

事务的ACID特性

原子性(Atomicity):一个事务中所有操作全部完成或失败
一致性(Consistency):事务开始和结束之后数据完整性没有被破坏
隔离性(Isolation):允许多个事务同时对数据库修改和读写
持久性(Durability):事务结束之后,修改是永久的不会被丢失

事务并发控制

可能产生哪些问题?

幻读:一个事务第二次查出现第一次没有的结果
非重复读:一个事务重复读两次得到不同的结果
脏读:一个事务读取到另一个事务没有提交的修改
丢失修改:并发写入造成其中一些修改丢失
解决并发异常,定义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. 索引的原理、类型、结构

什么是索引?

数据表种一个或者多个列进行排序的数据结构
索引能够大幅提升索引速度
创建、更新索引本身也会消耗空间和时间

什么是B-Tree?(查找结构进化史)

多路平衡查找树

B+Tree

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添加超时时间
锁的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)
       # 注意下方括号的范围
            if cls._lock == 1 or (time.time() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)):
                print "get lock"
                break
            else:
                time.sleep(0.3)

    @staticmethod
    def release(cls):
        if time.time() 

本篇关于《后端数据库攻略》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
【巨杉数据库Sequoiadb】数据节点什么时候回打印大量的连接日志【巨杉数据库Sequoiadb】数据节点什么时候回打印大量的连接日志
上一篇
【巨杉数据库Sequoiadb】数据节点什么时候回打印大量的连接日志
更简单易用的数据仓库,阿里云重磅推出分析型数据库3.0版
下一篇
更简单易用的数据仓库,阿里云重磅推出分析型数据库3.0版
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    23次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    35次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    37次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    46次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    40次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码