当前位置:首页 > 文章列表 > 数据库 > MySQL > 数据库(MySQL) 入门实践

数据库(MySQL) 入门实践

来源:SegmentFault 2023-02-16 15:30:50 0浏览 收藏

对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《数据库(MySQL) 入门实践》,主要介绍了MySQL,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

1 数据库

存放数据的仓库。例如你的账号信息,订单记录等。

2 SQL

Structured Query Language,用于访问和处理关系数据库的标准的计算机语言。

按照功能又可分为四大类;

  1. DQL

    查询语言,基本语句 SELECT;

  2. DML

    操纵语言,主要有三种形式,INSERT、UPDATE 和 DELETE;

  3. DDL

    定义语言,创建表、视图、索引等,CREATE TABLE;

  4. DCL

    控制语言,用来授权或回收某种特权,基本形式有 GRANT、 COMMIT 和 ROLLBACK;

3 NoSQL

Not Only SQL,泛指非关系型的数据库,通常以键值对或者文档形式存储。例如 Redis、MongoDB。

关系型数据库(MySQL)能通过外键建立表之间的联系,且相比 NoSQL 而言,还具备 ACID 特性。

但 NoSQL 操作无须 SQL 解析,读写性能较高,相比关系型数据库来说,不用预设存储结构,且天然支持分布式存储。

4 范式

数据库满足一定要求的条件称为数据库范式。又能根据程度的不同,简称为第 N 范式。

  1. 第一范式 1NF

    所有属性不可再分,例如属性 product 就不能分为 title 和 price,可以单独设置两个属性 productTitle、productPrice;

  2. 第二范式 2NF

    每张表都有一个属性作为唯一标识,其他属性完全依赖该标识,例如自增主键ID;

  3. 第三范式 3NF

    所有的非主属性不依赖于其他的非主属性。例如订单表中可以关联商品ID,但不应该关联商品非主属性 title 和 price 等;

为了提高查询效率,通常会添加冗余字段,这也就违背了 3NF,也称之为反三范式。

5 MySQL

MySQL 是一个 Oracle 旗下的关系型数据库,使用 SQL 语言进行增删改查操作。

开源免费,性能也比较好,和 PHP、Java 等 Web 开发语言完美配合,在中小型企业应用非常广泛。

后续内容都是基于 MySQL 数据库的前提下。

6 存储引擎

常见的有 MyISAM 和 InnoDB 引擎;

引擎默认版本外键锁粒度count(*)事务
MyISAM不支持表锁变量存储不支持
InnoDB>= 5.5支持行锁全表扫描支持

7 事务

一条或多条 SQL 组成一个事务(transaction),具备 ACID 四个特性;

  1. Atomicity 原子性

    一个事务内的所有操作,要么全部完成,要么全部失败;

  2. Consistency 一致性

    事务开始前后结束后不会破坏数据库的完整性,也就是说写入或修改的结构需要符合预设的规则;

  3. Isolation 隔离性

    防止事务交叉执行时导致数据的不一致。根据隔离程度分为 read uncommitted、read committed、repeatable read 和 serializable;

  4. Durability 持久性

    事务结束后,对数据的修改是永久的;

事务交叉执行可能会造成“脏读”、“幻读” 和 “不可重复读”;

  • 脏读

    一个事务读取到另外一个事务还未提交的数据;

  • 不可重复读

    一个事务内,多次读取同一数据返回结果不同;由于在此期间在数据被其他事务修改并已提交;

  • 幻读

    一个事务内,多次读取,返回不存在的记录;由于在此期间有其他事务写入数据;

read uncommittedread committedrepeatable readserializable
脏读×××
不可重复读××
幻读×

8 索引

数据库的“目录”,在数据量较大的情况下,可以极大地提高查询效率。

常见的索引数据结构有 B+ 树、Hash。以最常用的 B+ 树为例;

按照 B+ 树存储方式可以把索引分为两大类;

  1. 聚簇索引;

    叶子节点存放了一整行的信息;

  2. 非聚簇索引;

    叶子节点存放的是对应那行数据的主键,和该索引的值;

为什么是 B+ 树?

  1. 磁盘代价低;
  2. 查询更加稳定;
  3. 便于遍历;
  4. 支持范围查询;

一张结构为 id,groupId,name 的 t_user 表,id 为主键(聚簇索引),groupId 为普通索引(非聚簇索引)。

select name from t_user where groupId = 123;

先在叶子节点上得到对应的主键 id,然后再根据主键 id 得到 name 的值,这种行为称之为回表

select groupId from t_user where groupId = 123;

直接在叶子节点上就能得到 groupId 的值,不用回表操作,这种索引也被称为覆盖索引

按照功能类型又可以把索引分为三大类;

  1. 普通索引;

    最基本的索引类型,没有限制条件;

  2. 唯一索引;

    保证索引字段的值唯一,允许有 NULL;主键是一种特殊的唯一索引,不允许有 NULL;

  3. 联合索引;

    多个字段组成一个索引,具有“最左前缀”的原则;

什么是最左前缀?

a、b、c 三个字段组成联合索引,那么生效的列为 a、ab、abc、ac。(等值判断时顺序可交换,范围查询时会停止匹配)

9 锁

宏观来看,锁分为两种;行锁可归纳为两类;

  1. 共享锁(S)

    share,又称为读锁,已有 S 锁,可以加其他 S 锁,但不能加 X 锁;

  2. 排他锁(X)

    exclusive,又称为写锁,X 与其他任何锁互斥;

InnoDB 是通过给索引项加锁实现的行锁,可分为三种类型;

  1. record lock

    行级锁,锁定对应索引项;

  2. gap lock

    间隙锁,锁定索引项之间的间隙,左开右闭;

  3. next-key lock

    前两种的结合;

如果不通过索引项检索数据,会锁住整个表。

InnoDB 加锁方法:

  • 对于 UPDATE、DELETE、INSERT 自动加 X 锁;
  • 对于普通 SELECT 不会加任何锁;
  • SELECT ... LOCK IN SHARE MODE 显示加 S 锁;
  • SELECT ... FOR UPDATE 显示加 X 锁;

查询当前数据库锁状态;

select * from information_schema.innodb_locks;

对于不同类型的索引,加锁的方式也不一样;

  1. 普通索引

    加 next-key lock;

  2. 唯一索引

    加 record lock;

由于普通索引叶子节点存储了主键,所以加锁的字段是:普通索引 + 主键索引;

假设有如下数据表 t_ lock,其中 id 为主键,xid 为 普通索引;

select * from t_lock where xid = 8 for update;

那么根据 next-key lock 的定义,锁住区间为 (5, 30) 到 (8, 40),(8, 40) 到 (11, 50) 这两个区间;

便于理解我会合并为一个区间 (5, 30) 到 (11, 50)。

按照所以排序规则,假设另插入 (xid, id) 记录,那么总是满足以下条件;

  1. xid
  2. xid = 5;id
  3. xid = 5;id > 30;(阻塞)
  4. xid > 5 && xid
  5. xid = 11;id
  6. xid = 11;id > 50;(正常)
  7. xid > 11;id 无限制;(正常)

简单图示,当插入的数据落在这个区间则会阻塞,反之亦然;

10 RR 幻读

上面事务章节描述 RR 会导致幻读,MySQL 在 RR 下通过如下两点规避掉了;

  1. MVCC

    Multi-Version Concurrency Control,多版本并发控制。在普通 SELECT (快照度)时引入版本,同一个事务中只能读取不大于当前版本的数据快照;

  2. next-key lock

    需要加 X 锁的操作(当前读),加 next-key lock 可以有效避免产生幻读;

11 SQL 执行顺序

根据创建时间升序,查找支付成功超过 3 单的用户,需要去重;

select distinct t1.nickname
from t1 inner join t2
on t1.uid = t2.uid
where t2.pay_time > 0
group by t1.uid, t1.nickname
having count(*) > 3
order by t2.create_time
limit 10
  1. from
  2. on
  3. join
  4. where
  5. group
  6. having
  7. order
  8. select
  9. distinct
  10. limit

12 binlog

binlog 是 MySQL 最重要的日志,记录了所有的 DDL 和 DML 语句,主要目的是;

  1. 主从复制;

    在 Master 开启 binlog,并传递到 Slave 节点来达到 Master-Slave 数据一致性;

  2. 数据恢复;

    通过 mysqlbinlog 恢复数据;

检查 binlog 是否开启;

show variables like 'log_bin';

编辑 mysql 配置文件

mysqldump -h127.0.0.1 -uroot -p123456 db_test > db.sql

13 性能优化

  1. 索引;

    给经常用作查询条件,且区分度较高的字段建立索引;

  2. 分页查询;

    where id > ${lastId} order by id limit ${size},提高大表分页效率;

  3. 批量操作;

    批量插入用 insert into xxx values (xxx...), (xxx...),批量更新用 case when id;

  4. not null;

    null 会额外占用空间,且 count(xxx) 不会参与统计,若是索引列 is not null 也会失效;

今天带大家了解了MySQL的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
深入了解MySQL主从复制的原理深入了解MySQL主从复制的原理
上一篇
深入了解MySQL主从复制的原理
Mysql存储引擎选择
下一篇
Mysql存储引擎选择
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    12次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    22次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    38次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码