MySQL学习技术路线

微信公众号:云计算通俗讲义

持续输出技术干货,欢迎关注!

MySQL技术路线

1. 入门

数据库入门首选要学会基本环境搭建,然后选择一款顺手的图形界面工具,学习各种SQL语句,包括基本建库建表的DDL语句,然后增删改查语句,再掌握了基本的操作之后,需要学会使用一些高级特性,比如视图、存储过程、游标、自定义函数等。

1.1 安装配置

1.2 数据库设计

设计步骤

E-R图

三大范式

1.3 SQL基础

DDL

数据类型

1、整值类型:

整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、INTEGER、BIGINT

浮点数类型:FLOAT、DOUBLE

定点数类型:DEC、DECIMAL

位类型:BIT

2、字符串类型:

CHAR/VARCHAR

BINARY、VARBINARY

TEXT、BLOB

ENUM、SET

3、日期类型选择

DATE、DATETIME、TIMESTAMP、TIME、YEAR

字符集

1、概述

2、Unicode

3、汉字编码

4、字符集选择

5、MySQL字符集

表类型选择

1、存储引擎概述

2、各种存储引擎基本特性

3、如何选择存储引擎

约束

主键约束

<字段名> <数据类型> PRIMARY KEY [默认值]

主键自增长

字段名 数据类型 AUTO_INCREMENT

外键约束

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]

REFERENCES <主表名> 主键列1 [,主键列2,…]

唯一约束

<字段名> <数据类型> UNIQUE

检查约束

CHECK <表达式>

默认值

<字段名> <数据类型> DEFAULT <默认值>;

非空约束

<字段名> <数据类型> NOT NULL;

查看约束

SHOW CREATE TABLE <数据表名>;

CREATE

建库:

CREATE DATABASE [IF NOT EXISTS] <数据库名>

[[DEFAULT] CHARACTER SET <字符集名>]

[[DEFAULT] COLLATE <校对规则名>];

建表:

CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];

DROP

DROP DATABASE [ IF EXISTS ] <数据库名>

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

ALTER

修改库:

ALTER DATABASE [数据库名] {

[ DEFAULT ] CHARACTER SET <字符集名> |

[ DEFAULT ] COLLATE <校对规则名>}

修改表:

ALTER TABLE <表名> [修改选项]

字段:

ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;

DML

INSERT

INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]

VALUES (值1) [… , (值n) ];

INSERT…SELECT 语句向表中插入其他表的数据。

UPDATE

UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]

[ORDER BY 子句] [LIMIT 子句]

DELETE

DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]

TRUNCATE

TRUNCATE [TABLE] 表名

DQL

基本查询

SELECT

{* | <字段列名>}

[

FROM <表 1>, <表 2>…

[WHERE <表达式>

[GROUP BY

[HAVING [{ }…]]

[ORDER BY ]

[LIMIT[,] ]

]

别名

<表名> [AS] <别名>

条件查询

WHERE 查询条件

查询条件可以是:

带比较运算符和逻辑运算符的查询条件

带 BETWEEN AND 关键字的查询条件

带 IS NULL 关键字的查询条件

带 IN 关键字的查询条件

带 LIKE 关键字的查询条件

模糊查询

[NOT] LIKE  '字符串'

范围查找

[NOT] BETWEEN 取值1 AND 取值2

空值查询

IS [NOT] NULL

分组/聚合

GROUP BY  <字段名>

过滤分组

HAVING <查询条件>

排序

ORDER BY <字段名> [ASC|DESC]

去重

SELECT DISTINCT <字段名> FROM <表名>;

分页

LIMIT 初始位置,记录数

表连接

内连接

SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]

外连接

左外连接

SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2>

右外连接

SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2>

交叉连接

SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]

SELECT <字段名> FROM <表1>, <表2> [WHERE子句]

并集

子查询

WHERE <表达式> <操作符> (子查询)

其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。

1)IN | NOT IN

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。

2)EXISTS | NOT EXISTS

用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。

正则表达式

运算符

算数运算符

加(+)、减(-)、乘(*)、除(/,DIV)和模运算(%,MOD)

比较运算符

=、<>/!=、<=>、<、<=、>、>=、BETWEEN、IN、IS NULL、IS NOT NULL、LIKE、REGEXP、RLIKE

逻辑运算符

NOT/!、AND/&&、OR/||、XOR

位运算符

&、|、^、~、>>、<<

运算符优先级

常用函数

字符串函数

CONCAT()、INSERT()、LOWER()、UPPER()、LEFT()、RIGHT()、LPAD()、RPAD()、LTRIM()、RTRIM()、REPEAT()、REPLACE()、STRCMP()、TRIM()、SUBSTRING()

数值函数

ABS()、CEIL()、FLOOR()、MOD()、RAND()、ROUND()、TRUNCATE()

日期和时间函数

CURDATE()、CURTIME()、NOW()、UNIX_TIMESTAMP()、FROM_UNIXTIME()、WEEK()、YEAR()、HOUR()、MINUTE()、MONTHNAME()、DATE_FORMAT()、DATE_ADD()、DATEDIFF()

流程函数

IF、IFNULL、CASE WHEN

其他函数

DATABASE()、VERSION()、USER()、INET_ATON()、INET_NTOA()、PASSWORD()、MD5()

DCL

用户管理

创建用户

CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

修改用户

RENAME USER <旧用户> TO <新用户>

其中:

<旧用户>:系统中已经存在的 MySQL 用户账号。

<新用户>:新的 MySQL 用户账号。

删除用户

DROP USER <用户1> [ , <用户2> ]…

其中,用户用来指定需要删除的用户账号。

查看用户权限

在 MySQL 中,可以通过查看 mysql.user 表中的数据记录来查看相应的用户权限,也可以使用 SHOW GRANTS 语句查询用户的权限。

mysql 数据库下的 user 表中存储着用户的基本权限,可以使用 SELECT 语句来查看。SELECT 语句的代码如下:

SELECT * FROM mysql.user;

除了使用 SELECT 语句之外,还可以使用 SHOW GRANTS FOR 语句查看权限。其语法格式如下:

SHOW GRANTS FOR 'username'@'hostname';

其中,username 表示用户名,hostname 表示主机名或主机 IP。

GRANT

GRANT priv_type [(column_list)] ON database.table

TO user [IDENTIFIED BY [PASSWORD] 'password']

[, user[IDENTIFIED BY [PASSWORD] 'password']] ...

[WITH with_option [with_option]...]

REVOKE

REVOKE priv_type [(column_list)]...

ON database.table

FROM user [, user]...

密码管理

修改密码

SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');

重置密码

DPL

BEGIN TRANSACTION

COMMIT

ROLLBACK

1.4 高级特性

MySQL分区

1、什么是分区?

2、分区类型:Range、List、Columns、Hash、Key、子分区

3、分区管理

4、分区与性能

视图

1、什么是视图?

2、视图基本操作:

创建视图

CREATE VIEW <视图名> AS

修改视图

ALTER VIEW <视图名> AS

删除视图

DROP VIEW <视图名1> [ , <视图名2> …]

查看视图

DESCRIBE 视图名;

或简写成:

DESC 视图名;

存储过程

1、什么是存储过程

2、存储过程基本操作

创建存储过程

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体> [过程参数[,…] ] 格式

[ IN | OUT | INOUT ] <参数名> <类型>

修改存储过程

ALTER PROCEDURE 存储过程名 [ 特征 ... ]

删除存储过程

DROP PROCEDURE [ IF EXISTS ] <过程名>

查看存储过程

SHOW PROCEDURE STATUS LIKE 存储过程名;

游标

声明游标

DECLARE cursor_name CURSOR FOR select_statement;

打开游标

OPEN cursor_name;

使用游标

FETCH cursor_name INTO var_name [,var_name]...

关闭游标

CLOSE cursor_name;

绑定变量

定义变量

DECLARE var_name[,...] type [DEFAULT value]

为变量赋值

SET var_name = expr[,var_name = expr]...

自定义函数

CREATE FUNCTION sp_name ([func_parameter[...]])

RETURNS type

[characteristic ...] routine_body

触发器

1、什么是触发器

2、触发器基本操作:

创建触发器

CREATE <触发器名> < BEFORE | AFTER >

ON <表名> FOR EACH Row<触发器主体>

删除触发器

DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>

查看触发器

SHOW TRIGGERS;

全文索引

SQLMode

1、什么是SQL Mode?

2、常见SQL Mode

3、数据迁移中使用SQL Mode

2. 进阶

了解基本SQL操作和高级特性可以基本满足平时开发的需要,但是如果真正从事数据库底层开发,还需要了解这些SQL语句背后的算法,这就涉及索引实现及优化,锁的使用,事务控制,SQL优化。

如果需要掌握一个庞大的数据库系统的操作和运维,还需要掌握主从复制、备份恢复、高可用、基准测试。

2.1 索引

基本操作

创建索引

CREATE (UNIQUE) INDEX indexName ON table_name (column_name)

添加索引

ALTER table tableName ADD (UNIQUE) INDEX indexName(columnName)

删除索引

DROP (UNIQUE) INDEX [indexName] ON mytable;

显示索引

SHOW INDEX FROM table_name; \G........

底层数据结构

二叉树

B树

B+树

索引失效

索引设计原则及优化

锁分类

读锁/写锁

表锁/行锁/页锁

共享锁/排它锁

乐观锁/悲观锁

锁与并发控制

无锁:MVCC

死锁

日志

错误日志

二进制日志

查询日志

慢查询日志

备份恢复

备份恢复策略

逻辑备份与恢复

物理备份与恢复

导入导出

导入

SELECT ... INTO OUTFILE

mysqldump

导出

mysql

使用 mysql 命令导入语法格式为:

mysql -u用户名    -p密码    <  要导入的数据库数据(runoob.sql)

source

source 命令导入数据库需要先登录到数库终端:

mysql> create database abc;      # 创建数据库

mysql> use abc;                  # 使用已创建的数据库

mysql> set names utf8;          # 设置编码

mysql> source /home/abc/abc.sql  # 导入备份数据库

LOAD DATA

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;

mysqlimport

$ mysqlimport -u root -p --local mytbl dump.txt

事务

什么是事务?

ACID实现原理

事务控制

分布式事务

SQL优化

SQL优化的基本步骤

常用优化策略

服务器优化

磁盘存储优化

应用优化

架构

主从复制

1、主从复制原理

2、启动参数

3、主从切换

MySQL Cluster

高可用

1、高可用架构

词法解析/语法解析

词语解析

语法解析

语义分析

Lex/yacc

InnoDB存储引擎

体系架构

内存结构

Buffer pool

缓冲池缓存的数据包括Page Cache、Change Buffer、Data Dictionary Cache等,通常 MySQL 服务器的 80% 的物理内存会分配给 Buffer Pool。

Change Buffer

Change buffer 的主要目的是将对 非唯一 辅助索引页的操作缓存下来,以此减少辅助索引的随机IO,并达到操作合并的效果。

Adaptive Hash Index

自适应哈希索引(AHI)查询非常快,一般时间复杂度为 O(1),相比 B+ 树通常要查询 3~4次,效率会有很大提升。innodb 通过观察索引页上的查询次数,如果发现建立哈希索引可以提升查询效率,则会自动建立哈希索引,称之为自适应哈希索引,不需要人工干预,可以通过 innodb_adaptive_hash_index 开启,MySQL5.7 默认开启。

Log Buffer

磁盘结构

段/区/页

表空间

系统表空间

数据字典

Checkpoint

Double Write

Undo

InnoDB File-Per-Table表空间

redo log

事务

隔离级别

ACID

测试

学习数据库,必要的测试工具还是需要掌握的。比如压力测试、稳定性测试等等。

基准测试

测试工具

3. 拓展

学习关系型数据库MySQL,其实还是需要对比着学习一些其他关系型和非关系型数据库,对比它们底层实现原理不同,算法,事务以及应用场景。

这其中包括数据库巨头产品Oracle,因为现在市场占有率还是非常大,如果想要迁移到MySQL,还是需要对Oracle有一个比较系统的了解。而对于现在比较流行的NoSQL,也是需要重点关注的,主要是因为关系型数据库在某些场景不适用,此时Redis等内存数据库可以有效解决,同时二者在应用场景等方面也存在诸多不同。

3.1 Redis

什么是NoSQL?

数据类型

基本操作

持久化

事务

主从复制

集群

3.2 MongoDB

索引

事务

3.3 Hive SQL

4. 推荐书籍

编译原理:

龙书,编译器原理的经典之作,但是不需要每个章节都需要深入了解,当作工具书使用就行,大概原理弄懂即可,深究可能很容易糊涂。

词法解析:

这个是市面上不多的讲解词法解析和语法解析的书,介绍的是flex和bison,贴近实际开发,这本书比龙叔要更贴近实践也更易懂。

数据库入门:

网易数据库大牛的著作,讲解比较全面细致,设计基本SQL,索引,锁,备份恢复,主从复制等等。

数据库提升:

这本书讲解的涉及基本语句的实现原理以及应用场景,非常好,可以作为提升。

数据库提升的经典之作,涉及非常知识面非常广泛,包括TPCC测试,主从复制原理,备份恢复,高可用,高并发等等。

存储引擎:

姜承尧老师经典著作,存储引擎底层原理介绍,非常全面详细,对于了解ACID实现原理,MVCC,redo、undo log等等实现原理非常有用,了解存储引擎必备书籍。

索引:

专门讲解索引的原理,优化,讲解的非常好也很实用。

你可能感兴趣的:(MySQL学习技术路线)