跳至主要內容
Mysql - 10索引2 - 优化索引方法

索引2

什么时候需要 / 不需要创建索引?

索引最大的好处是提高查询速度,但是索引也是有缺点的,比如:

  • 需要占用物理空间,数量越大,占用空间越大;
  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增大;
  • 会降低表的增删改的效率,因为每次增删改索引,B+ 树为了维护索引有序性,都需要进行动态维护。

所以,索引不是万能钥匙,它也是根据场景来使用的。

什么时候适用索引?

  • 字段有唯一性限制的,比如商品编码;
  • 经常用于 WHERE 查询条件的字段,这样能够提高整个表的查询速度,如果查询条件不是一个字段,可以建立联合索引。
  • 经常用于 GROUP BYORDER BY 的字段,这样在查询的时候就不需要再去做一次排序了,因为我们都已经知道了建立索引之后在 B+Tree 中的记录都是排序好的。

code中间件Mysql大约 11 分钟
Mysql - 9索引1 - 索引介绍

索引

索引分类

按数据结构分:

  • B+ 树索引
  • 哈希索引

功能分:

  • 主键索引 (Primary key)
  • 唯一索引 (Unique)
  • 普通索引 (Normal)
  • 前缀索引
  • 全文索引 (Full text)

存储位置分:

  • 聚簇索引
  • 非聚簇索引 (二级索引)

按数据结构分

MySQL 常见的存储引擎 InnoDB、MyISAM 和 Memory 分别支持的索引类型 (数据结构)


code中间件Mysql大约 13 分钟
Mysql - 6 事务2

事务2

MVCC 多版本并发控制

多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

工作原理

  • Read View 中四个字段作用;
  • 聚簇索引记录中两个跟事务有关的隐藏列;
行隐藏字段

InnoDB在每行数据都增加三个隐藏字段,一个唯一行号,一个记录创建的版本号,一个记录回滚的版本号


code中间件Mysql大约 12 分钟
Mysql - 7 锁

锁的目的就是在我执行语句和返回结果这段时间内,不能让其他事务对相关数据进行修改或访问,以保证数据的一致性 (不能出现脏读、幻读、不可重复读等)

在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类

  • 全局锁 (FTWRL)
  • 表级锁
    • 表锁
    • 元数据锁
    • 意向锁
    • AUTO-INC 锁
  • 行级锁
    • Record Lock
    • Gap Lock
    • Next-key Lock

code中间件Mysql大约 16 分钟
Mysql - 8 日志

日志

Buffer Pool

MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录

修改完这条记录是选择直接写回到磁盘,还是选择缓存起来呢?

当然是缓存起来好,这样下次有查询语句命中了这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了

Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能

Buffer Pool作为InnoDB内存结构的四大组件之一,不属于MySQL的Server层,是InnoDB存储引擎层的缓冲池, 跟MySQL8.0删掉的 查询缓存 功能是不一样的


code中间件Mysql大约 27 分钟
Mysql - 2数据类型与约束

数据类型

数值类型

常见:

  • smallint用于存储小的整数,范围在 (-32768,32767)
  • int用于存储一般的整数,范围在 (-2147483648,2147483647)
  • bigint用于存储大型整数,范围在 (-9,223,372,036,854,775,808,9,223,372,036,854,775,807)
  • float用于存储单精度小数
  • double用于存储双精度的小数
类型 字节 范围 说明
TINYINT 1 -128 ~ 127 / 0 ~ 255 微小整数
SMALLINT 2 -32768 ~ 32767 小整数
MEDIUMINT 3 -8388608 ~ 8388607 中整数
INT / INTEGER 4 -2147483648 ~ 2147483647 整数
BIGINT 8 -2^63 ~ 2^63-1 大整数
FLOAT 4 单精度浮点数 近似值
DOUBLE 8 双精度浮点数 近似值
DECIMAL(M,D) 变长 精确小数 M总位数,D小数位数

code中间件Mysql大约 2 分钟
Mysql - 20索引

索引

索引分类

按数据结构分:

  • B+ 树索引
  • 哈希索引

功能分:

  • 主键索引 (Primary key)
  • 唯一索引 (Unique)
  • 普通索引 (Normal)
  • 全文索引 (Full text)

存储位置分:

  • 聚簇索引
  • 非聚簇索引 (二级索引)

InnoDB存储方式和查询

InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16 KB。


code中间件Mysql大约 10 分钟
Mysql - 3 SQL语句

SQL语句

结构化查询语言(Structured Query Language)简称SQL,这是一种特殊的语言,它专门用于数据库的操作。每一种数据库都支持SQL,但是他们之间会存在一些细微的差异,因此不同的数据库都存在自己的“方言”。

SQL语句不区分大小写(关键字推荐使用大写),它支持多行,并且需要使用 ; 结尾

SQL也支持注释,通过使用--或是#来编写注释内容,也可以使用/*来进行多行注释

四种 SQL 语言类型:

  • DDL: 数据库定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言
  • DML: 数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,是开发以数据为中心的应用程序必定会使用到的指令。
  • DQL: 数据查询语言(Data Query Language, DQL)基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块。
  • DCL: 数据库控制语言(Data Control Language,DCL)。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。

code中间件Mysql大约 5 分钟
Mysql - 4 SQL语句2

SQL语句

DQL (数据库查询语言)

DQL 的核心命令是 SELECT,用于从一个或多个表中检索数据

基本语法

SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件
GROUP BY 分组列
HAVING 分组条件
ORDER BY 排序列 ASC|DESC
LIMIT 限制行数;

code中间件Mysql大约 9 分钟
Mysql - 5 事务与视图

视图

视图(View)是一个虚拟表,它是基于 SQL 查询结果集的可视化表示

视图本质就是一个查询的结果,不过我们每次都可以通过打开视图来按照我们想要的样子查看数据。既然视图本质就是一个查询的结果,那么它本身就是一个虚表,并不是真实存在的,数据实际上还是存放在原来的表中。

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

CREATE VIEW 视图名称(列名) as 子查询语句 [WITH CHECK OPTION];

code中间件Mysql大约 10 分钟