在windows中安装MySQL
    1 MySQL特点:体积小、性能卓越,是许多中小型网站开发的首选数据库
    2 一开始由瑞典公司MySQL AB进行开发的,后被Sun/Oracle收购后,MySQL采用了双授权政策
    分社区免费版和商业版,社区版能满足大部分开发者的需求,学习时,用社区免费版即可。
    3 社区版下载页https://dev.mysql.com/downloads/mysql/
    4 MySQL是一款系统软件
    将MySQL添加至环境变量PATH
    1 MySQL的安装目录是在第三步中填写的安装路径名。
    例如填写的安装路径为D:\MySQL,则MySQL在安装完毕后,会在该路径下创建一个 名为
    MySQL Server xxx的目录,xxx表示MySQL Server xxx的版本号。
    将该目录下的bin目录添加到windows系统的环境变量Path中。
    2 配置完后,执行cmd命令进入windows命令行,在命令中执行mysql -uroot -p命令可以进入MySQL的交互模式。
    -u,一个-表示是短选项,—u
    交互模式中的命令以英文分号“;”结尾,输入exit;退出MySQL交互模式
    3 为什么要将MySQL添加到环境变量中?因为需要在命令行中操作应用
    4 PATH是环境变量,保存的是应用路径,添加路径到PATH中,可以在命令行中使用该应用。
    什么是数据库
    1 存储数据的仓库。不是杂乱无章地存储,而是按一定的数据结构,进行组织、存储、管理。
    2 数据结构是一种数据组织地方式,根据数据集合中的元素排列关系,分为线性结构、非线性结构。
    3 线性结构进行组织是指数据集合中的元素在逻辑结构上是直线的关系。
    4 非线性结构进行组织是指数据集合中的元素在逻辑结构上不是一条直线,可以是曲的,折的,分叉的。
    数据库的分类(存储介质)
    1 按存储介质的不同,数据库分为硬盘数据库、内存数据库。
    2 硬盘数据库是指数据存储在硬盘上,优点是容量大、可持久化存储,缺点是读写速度慢。(相对于内存)
    3 内存数据库是指数据存储在内存中,优点是读写速度快,缺点是容量小、不能持久化存储,断电数据就会消失。
    某些数据库的内存存储是支持持久化到磁盘的。
    数据库的分类(组织方式与存储方式)
    1 数据库按数据地组织方式和存储方式的不同,分为关系型数据库、非关系型数据库。
    2 关系型数据库存储的是结构化的数据,以关系模型进行数据地组织和管理,代表性的有MySQL,Oracle。
    什么是关系模型?什么是结构化?
    结构化是指有结构的,且结构通常不变化的。例如二维表结构,excel表。用二维结构是方便人类的理解
    什么是非结构化?
    例如音频、视频、图片等
    3 非关系型数据库通常以key-value的形式存储,代表性的有Redis,Mongodb。
    Redis是将数据存储在内存当中,也支持
    4 MySQL实质是一种关系型地数据库管理系统,将数据以关系模型地组织方式存储在硬盘中,并对外提供数据操作地接口。
    是一款软件
    简单的文件存储
    1 在json格式中,定义type字段来区分数据的类型(区分原理?)
    2 data字段保存了具体类型下地数据,将程序中需要访问的数据写入json文件中,程序运行时再读取
    实现了一定程度上的数据独立性。(不独立是指不写进json文件,运行时直接读取吗?)
    3 这样的设计也有不足,程序运行时需要将文件中地内容全部读取到内存中,
    如仅需处理type为0的数据,就会造成资源浪费(这里地资源是指内存吗?)
    4 硬盘数据库本质是通过文件进行存储的。以文件为单位,实现数据的存储和共享。
    文件已是最小单位,再划分也是文件。
    5 利用文件存储,将程序和数据分离开,让程序和数据有一定的独立性。
    利用解耦合的思想。
    6 json文件按type进行分类,不同的数据存储在不同的文件中,文件的逻辑结构发生变化后,
    程序的逻辑也必须做出相应的修改。这样文件的逻辑结构与程序存在很强的耦合性。
    json是一种半结构化的数据,因为结构会发生变化。
    html也是半结构化的数据
    7 以文件为单位进行数据的存储,文件之间缺乏必要的关系,多个程序都有其对应的文件。
    有可能同一份数据会在多个文件中重复存在,容易造成数据的冗余。
    8 简单的文件存储,存在诸多的弊端。
    9 这种文件单位的存储,很难处理字段级别的的查询,在查找一个目标字段的时候,需要将所有目录
    文件逐一读取到内存中,然后逐一判断是否等于目标字段,如果文件数量很大,过程就会非常耗时
    解决问题:可以对这个文件再拆分,将目标文件再拆分到一个文件。但仍不够完美!
    10 以文件为中心的存储方式,虽可以把数据组织成相互独立的文件,实现记录内容的结构性
    但整体却是无结构的,不能对文件进行结构化操作。(什么是结构化操作?)
    答:结构化操作就是可以直接找到要读取的文件,像字典查找数据,有哈希表。列表查找则是无结构化的操作
    DBMS简介((Database Management System)
    1 DBMS就是程序员编写的一个复杂的软件,它对数据进行集中的管理和控制,来保证数据的安全性和完整性。
    2 对DBMS进行分类,按数据组织和存储方式的不同,可以分为关系型的DBMS和非关系型的DBMS
    3 DBMS是在文件系统的基础上发展而来的,同简单的文件存储一样,都是对数据进行组织的管理技术
    4 用户用文件进行数据共享时,利用的是操作系统提供的接口进行文件的读写。
    例如增删改查功能,每个功能都是由操作系统提供相应的操作接口,例如增接口。
    5 用户用DBMS进行数据共享时,利用的是DBMS对外提供的用户接口来对数据进行处理。
    6 DBMS在内部实现中,也是以文件为单位进行存储,同简单文件存储的区别在于,
    DBMS在内部采用了复杂的数据模型来表示数据结构,真正实现了以数据为中心的数据共享。RDBMS:关系型数据库管理系统
    1 RDBMS,意思是关系型数据库管理系统。采用关系模型来进行数据组织的数据库管理系统
    2 MySQL数据库和Oracle数据库的实质就是一种关系型数据库管理系统。
    3 在关系模型中,一个关系对应一张二维表。二维表由行和列组成
    行由一个一个的记录组成,每一个记录就是一个元组。列由一个一个字段组成。
    4 在关系模型的二维表结构中,每一行中记录被称为一个元组,就是关系中的一个元组。
    5 关系模型:定义三个方面,关系结构(例如二维表结构)、关系操作(例如增删改查操作)、关系约束(一种限定、规定)
    关系结构:关系型数据库管理系统使用二维表结构进行对数据组织和管理
    关系操作:对数据进行增删改查等操作。通过SQL结构化查询语言
    关系约束:
    关系型数据库核心概念
    1 table(表):一种二维的数据结构,由行列组成
    2 relation(关系):关系对应的是一张二维表格
    3 row(行):对应二维表中的一行记录,又成为元组
    4 column(列):对应二维表中的每一列数据,又称为属性。
    5 关系模型定义了关系的结构,关系的操作,以及关系的约束。
    数据库中的事务
    1 事务是DBMS执行过程中的一个逻辑单元,由一个有限的操作序列构成。
    2 该操作序列被视为一个整体在系统中进行提交,在事务的提交过程中,操作序列中的操作
    要么全部执行成功,要么全部执行失败。
    3 在DBMS中,通过事务来保证对数据操作的安全性和完整性(因为事务是一个逻辑单元,执行提交遵循原子性原则)
    4 原子性:指操作集合里面的操作要么完成执行,要么完全不执行。
    例如对数据A进行修改会有三个步骤1:读取A的值,2:对读取到的值进行修改,3:将值写回A中
    这三个操作步骤,要么全部成功,要么全部失败,这就所谓的原子性。
    5 一致性:指事物执行的结果必须是一种一致性状态,转换为另一种一致性状态,状体的转换过程对外不可见。
    一致性由原子性来保证的
    一致性状态中的一致性,是指什么一致性?就是前后状态的的一致性要和变动的量保持一致。
    例如:银行转账,转账前后逻辑上的一致性。
    6 隔离性:指当前事务在执行的过程中不能被其它事物干扰。
    按读写的维度进行划分,数据库中的事物可分为读事物和写事物。
    假设数据库中同时存在对数据A进行读事物,和对数据A的写事物,则在读事务读取A的数据时,
    不能被写事务干扰。解决的方法是将读事务与写事务进行隔离,读事务要么先在数据A 读取数据,
    要么在写事务完成后,再进行数据A的读取。
    7 数据库事务定义了四种隔离级别,由低到高进行排序为:Read uncommitted、Read committed、Repeatable read,Serializable。
    未提交读、提交读、可重复读(每次读的都是一样的数据)、串型读
    事务隔离级别越高,能更有效保证对数据进行并发读写的正确性。(高级别保证读写正确性之外,有没有弊端呢?否则干嘛要设计不同级别)
    8 持久性:指事物一旦提交,对数据库中的数据的改变就应该是永久性的。
    9 事务的四个特性:ACID(简称),分别是原子性、一致性、隔离性、持久性
    SQL:结构化查询语言
    1 英文全称为:Structured Query Language,简称SQL,是一种数据库语言
    2 在RDBMS中,通过SQL来对数据进行查询、更新、以及数据库管理。
    3 学习结构化语言,主要学习SQL中动词用法,主要组成部分为DDL、DQL、DML、TCL
    4 DDL:数据定义语言,核心动词包括CREATE,DROP,ALTER分别表示表格的创建、删除、修改
    5 DQL:数据查询语言,核心动词为SELECT(挑选,筛选),表示从表格中查询数据
    6 DML:数据操作语言,核心动词为INSERT(插入 增),UPDATE(更新),DELETE(删除)分别表示在表格中插入数据、更新数据、删除数据。
    7 TCL:事务控制语言,用来对DML语言进行事务控制,核心动词为COMMIT(提交)、ROLLBACK(回滚),表示对事物进行提交回滚
    MySQL的基本语法
    启动MySQL服务器
    1 在windows系统中进入控制面板,点击管理工具的设置图标,双击服务,可以在窗口的服务列表中找到并启动
    MySQL-Service,或者直接进入windows命令行执行net start mysql命令来启动MySQL服务。
    2 在linux系统管理MySQL服务需要使用systemctl命令,sysenctl命令常用选项有start、restart、stop、status
    3 start:启动某一个服务,例如启动MySQL服务:systemctl start mysqld
    4 restart:重启某一服务,例如重启MySQL服务:systemctl restart mysqld
    5 stop:停止某一服务,例如停止MySQL服务:systemctl stop mysqld
    6 status:查看服务的状态,例如查看MySQL服务状态:systemctl status mysqld
    windows命令行进入MySQL交互模式
    1 将MySQL的bin目录添加到环境变量PATH中,在命令行执行mysql -u username -p password -h host
    user_name表示登录的用户名,password表示登录密码,host表示登录的主机地址(默认为本地)
    2 进入交互模式以后执行exit;退出交互模式。
    3 如何在交互模式中修改用户的登录密码?修改密码时要注意当前的MySQL是什么版本
    MySQL常用系统变量
    1 @@version:MySQL当前版本号
    2 @@port:MySQL端口号
    端口号,用来识别网络程序,确定信息要传递给哪个应用程序。
    端口冲突,解决方法就是修改端口号!
    3 @@datadir:MySQL数据存储的目录
    4 @@basedir:MySQL的安装目录
    5 MySQL的系统变量以@@作为前缀,查看变量的值使用select命令,比如查看MySQL当前版本号:select @@version
    6 白名单:
    MySQL show命令
    要区分show命令和select命令的区别
    1 MySQL的show命令用来快速查找数据库,表格,以及操作的状态信息,常用的show命令如下:
    2 show databases:查看所有数据库
    3 show tables [from database]:查看数据库中所有的表格
    4 show columns from table:查看table中的所有列
    5 show create database database_name:查看数据库中database_name的创建SQL
    6 show create table table_name:查看数据表table|_name的创建SQL
    7 show global | session variables like ‘variable’:查看全局或会话变量的值,参数variable中可带通配符%、

    %表示匹配任意多的字符,_表示匹配单个字符,like表示模糊匹配
    8 在命令行当中要查找某个pass
    MySQL的配置文件
    1 MySQL服务器启动以后,会自动读取配置文件,对数据库进行初始化。
    2 windows的MySQL配置文件的默认路径:C:\ProgramData\MySQL\MySQL Server xx\my.ini
    3 linux的MySQL配置文件的默认路径:/etc/my.cnf
    4 配置文件主要分为三个区域[client],[mysql],[mysqls] (是[mysqld]???)
    5 [client]所对应的区域主要用来配置连接参数,比如连接的用户名、密码、端口号
    6 [mysql]对应的区域用来配置mysql客户端的默认字符集
    7 [mysqld]对应的区域用来配置服务参数,比如监听的端口号、服务端字符集、数据目录、根目录等
    8 MySQL的配置文件不是json文件,其他文件也可以做配置文件。
    9 数据库存储的是字符
    创建数据库与数据表(重点掌握)
    1 对MySQL数据库的操作主要分为三类:
    2 ①创建数据库与数据表
    3 ②数据表的增删改查
    4 ③管理数据库与数据表
    数据库的创建与删除
    1 创建数据库并指定数据存储的字符编码与排序规则如下:
    lCREATE DATABASE db_name [DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci]
    用utf8mb4表示utf-8编码,utf8mb4_0900_ai_ci表示比较规则
    2 ①在MySQL交互模式中执行show character set来查看系统中的所有字符集。
    在show命令中,可以使用like进行模糊查询,%符号表示通配符。
    3 ②在MySQL交互模式中执行show collation命令,可以查看系统中的所有COLLATE类型。
    同样可以使用like进行模糊查询
    4 删除数据库,需要使用DROP动词:DROP DATABASE database_name
    数据表的创建与删除
    1 创建数据库以后,执行use命令进行切换,比如use mysql,切换到mysql数据库。
    2 使用CREATE动词来创建数据表,基本语法如下:
    CREATE table_name(column column_tpye[column_constraint[table_constraint(column)]])
    ENGINE=InnoDB DEFAULT CHARSET=utf-8mb4 COLLATE=utf-8mb4_0900_ai_ci
    字段名、字段类型、
    3 column_type表示数据类型,constraint表示约束类型,ENGINE表示数据的存储引擎,
    CHARSET表示字符集,COLLATE表示排序规则。
    MySQL基础数据类型:数值类型
    1 数值类型 大小 描述
    2 TINYINT 1字节 小整型类型
    3 SMALLLINT 2字节 小整数类型
    4 MEDIUMINT 3字节 小整型类型
    5 INT 4字节 MySQL中默认的整数类型
    6 BIGINT 8 字节 大整数类型
    7 FLOAT 4字节 单精度浮点类型
    8 DOUBLE 8字节 双精度浮点类型
    9 DECIMAL 用来存储精确的数值,使用形式为ECIMAL(M,D),M表示有效数字的精度范围为1~65,
    D表示小数点后的位数,范围是0~30,在MySQL中,要求D<=M
    MySQL基础数据类型:字符串类型(重点使用CHAR、VARCHAR)
    1 字符串类型 大小 描述
    2 CHAR 0~255字符 表示定长的字符串,在使用时需要设置长度
    例如:name char(5):表示定义了一个name字段,使用固定的5个字节来进行存储,如果数据超出5个字符,则进行裁断处理
    静态数据适合缓存,
    3 VARCHAR 0~65535字符 表示长度可变的字符串,在使用时需要设置长度
    例如:name varchar(10):表示定义了一个name字段,使用可变长度进行存储,这里的可变长度是指按数据的实际长度进行存储。
    例如实际长度为5个字节,则只用5个字节进行存储,如果超过10个字节,则进行截断处理。
    4 TINYBL0B 0~255字符 表示二进制字符串
    5 TINYTEXT 0~255字符 表示短文本字符串
    6 BL0B 0~65535字符 表示二进制形式的长文本数据
    7 TEXT 0~65535字符 表示长文本数据
    8 MEDIUMAL0B 0~16777215字符 表示二进制形式的中等长度长文本数据
    9 MEDIUMTEXT 0~16777215字符 表示中等长度的文本数据
    10 L0NGBL0B 0~4294967295字符 表示二进制形式的超长文本数据
    11 L0NGTEXT 0~4294967295字符 表示超长文本数据
    问题:处理以中文为主
    MySQL基础数据类型:时间日期类型
    1 时间日期类型 大小 描述
    2 DATE 3字节 格式为YYYY-MM-DD,表示年月日的日期值
    3 TIME 3字节 格式为HH-MM-SS,表示时分秒的时间值
    4 YEAR 1字节 格式为YYYY,表示年份
    5 DATETIME 8字节 格式为YYYY-MM-DD HH:MM:SS,表示年月日,时分秒的日期时间
    6 TIMESTAMP 4字节 表示自1970-01-01 00:00:00开始,从2038年结束的时间戳值。
    问题:为什么是2038年?
    MySQL约束类型(分字段约束、参照性约束)
    1 约束类型 描述
    2 NOT NULL 非空约束,约束属性值不能为空
    3 DEFAULT 默认值约束,为属性设置一个默认值
    4 UNIQUE 唯一性约束,约束该属性必须唯一
    5 PRIMARY 主键的约束,约束该键的类型为主键,数据表中最多只存在一个主键(包含非空、唯一的属性)
    6 AUTO_INCREMENT 对唯一键进行扩展的完整性约束,使用该约束时,字段上的值会自动生成一个唯一的
    自增ID,一个表中只能有一个字段设置该属性
    7 FOREIGN KEY 外键约束,约束该键的类型为外键
    8 只能存在一个主键、一个自增。其他的都可以存在多个。
    外键约束(参照性约束,用在表与表之间的)
    1 引用了外键的数据表被成为从表,这个外键是其他数据表的主键,以这个外键作为主键的数据表称为主表。
    例如A表以id作为主键,B表将A表的id引用为外键,这时候A表为主表,B表为从表。
    从表的外键依赖主表,
    2 在从表中引用主键时,需要使用references关键字,并且定义主表数据项在删除或更新时的关联行为。
    问题:如何关联?例子?
    3 主表数据项被删除或更新时的关联行为如下:
    使用表级约束来定义外键的语法:CREATE table_name(FOREIGN KEY(column) REFERENCES PRIMARY_TABLE(coluumn))
    使用on delete来定义主表数据删除时的关联行为,
    使用on update来定义主表数据更新时的关联行为。
    4 从表的关联行为 描述
    cascade 主表进行删除或更新时,从表同步进行删除或更新 级连操作
    set null 主表进行删除或更新时,从表将外键设置为空
    no action 禁止主表进行删除或更新操作
    5 以主表数据项被删除时,从表的关联行为进行举例:
    CREATE table_name(FOREIGN KEY(column) REFERENCES PRIMARY_TABLE(column) ON DELETE CASCADE)
    MySQL中的存储引擎
    1 存储引擎是MySQL的核心,所谓的存储引擎是指数据在系统中的存储实现方式。
    2 MySQL中的主要存储引擎:
    存储引擎类型 描述
    InnoDB MySQL中的默认存储引擎,支持事务和外键
    MyISAM 用来管理非事务表,不支持事务和外键,提供高速存储和全文检索
    MEMORY 将数据存储在内存中
    3 在MySQL交互模式中,输入show engins命令,可以查看系统中的所有存储引擎
    创建数据表的代码实例
    1 pass
    对数据表的增查改删
    插入数据
    1 使用INSERT插入数据(逐字段进行插入)
    2 SQL语法:INSERT[IGNRE] INTO table_name (column) values (value)
    表示在数据表table_name中的字段column中插入值value。
    column或value指代数据表中的一个或多个字段(值),字段名或字段值之间以逗号进行分隔
    3 SQL实例:mysql>insert into great_woman(id,name,role)values(1,”婴宁”,”狐仙”);
    4 在没有约束的情况下,重复插入是不会忽略的
    5
    查询数据
    1 表达式也是字符串
    2 是通配符,尽量不使用在数据查询时
    3 where 筛选条件
    子查询(重点)
    事务的四大特性
    1 Innodb存储引擎
    1 支持事务处理
    手动开启事务与自动开始事务的优缺点
    手动优点:按需开启、多个事务也只需开启一次、提交一次。
    手动缺点:没有提交,会造成阻塞。例如长事务,执行的世间长,万一没有提交,会长时间阻塞。
    自动优点:不会忘记提交造成阻塞。
    自动缺点:每个事务都开启一次,提交一次。事务多时,就会频繁的提交。
    对事物进行回滚
    MySQL支持四种隔离级别(重点)
    1 未提交读,会出现脏读,其他未提交的也可以读取到
    2 已提交读,
    3 可重复读,保证每次读取到的都是同样的数据,会出现幻读(会出现多一条数据)
    4 可串行化,每次只有一个事务执行,其他事务不能执行,就不会更新数据。就不会读取到其他的数据
    事务的并发读写问题
    1
    MySQL中的主要存储引擎
    1
    数据表的文件组织方式
    1 ibd后缀文件是表空间文件
    2 元数据信息文件的元数据是指表的字段信息等
    B+数1
    1 叶子节点才保存数据,
    2 哈希表是等值查找
    3 B+数是范围查找(二分查找),同时也可以等值查找
    4 B+数的结构是有序的,所以不能随意变动。
    Innodb的索引结构(重点)底层的查找原理
    1 Innodb
    2 用ALTER来创建索引
    3 复合索引,是保存多个字段的索引
    4 在Innodb中,对主键使用聚簇索引
    5 索引和数据存储在同一文件中的,所以由聚簇索引、非聚簇索引。
    MyISAM的索引结构
    1 索引与数据进行分开存储,所以没有聚簇索引、和非聚簇索引。
    所以叶子节点实际存储的是数据文件中的一个偏移量。
    Innodb的并发管理(重点)
    1 表锁,并发度低
    2 行锁,并发度高,但容易出现死锁。
    S锁:共享锁。只对共享锁共享,对其他锁也是排斥的。
    X锁:排它锁。对所有锁都是排斥
    3 意向锁
    4 记录锁,
    5 间隙锁,防止幻读(读到新增的数据)
    Innodb的MVCC(重点)
    1 不用加锁,但需要额外空间保存每一个版本号的数据,造成冗余。无锁并发控制!
    2 乐观锁
    3 悲观锁
    MyISAM的并发管理
    1
    2
    fulltext key 全文索引
    key 普通索引
    primary key 主键索引
    优化数据库
    1 单表数据量过大,主要是水平拆分
    2 单库数据量过大,主要是垂直拆分,按业务维度。扩容,垂直扩容(加硬盘、换CPU)水平扩容(增加机器)
    3 热点集中问题(取余拆分)
    4 不要过度设计(拆分)
    *数据库的主从架构

    1 就是备份,但不单纯的备份
    2 写操作在主数据库,读数据库在从数据库
    3 同时给主数据库、从数据库增加几台备用机器,通常有两三台备用的,数据也是同步更新的。