type
status
date
slug
summary
tags
category
icon
password
Property
Mar 31, 2024 04:13 PM
前言
用一篇文章来记录我的Mysql学习笔记。
01 基本
树状结构
- 一个节点只能有一个父节点,根结点除外,不然需要引入冗余节点
- 查询速度满,从根节点开始,树状结构
- 每个父节点不能脱离父节点单独存在,父节点删除,自节点全部删除
关系型 表结构
不会有冗余数据,删除一条数据,不会影响其他
02 安装mysql
03 链接和断开
退出
显示数据库
3.1 informationschema
保存着关于MySQL服务器所维护的所有其他数据库的信息。
如数据库名,数据库的表,表栏的数据类型与访问权限等
3.2 mysql
MySaL系统数据库,保存了登录用户名,密码,以及每个用户的权限等等
3.3 performance_schema
用来保存数据库服务器性能的参数
3.4 sys
这个库是通过视图的形式把information schema 利lperformence schema结合起来,查询出更加令人容易理解的数据
04 其他概念
学习数据库的增删改查(数据库,数据表,数据)
SQL
SQL语句功能划分
DDL:数据定义语句
用来定义数据库对象:创建库,表,列等。
DML:数据操作语句
用来操作数据库表中的记录
DQL:数据查询语句
用来查询数据
DCL:数据控制语句
用来定义访问权限和安全级别
数据类型分类
- 数值类型
- 字符串类型
- 日期和时间类型
MySQL中常用的数据类型如下:
Double 浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
Char:固定长度字符串类型:char (10) ‘ Inj
Varchar:可变长度字符串类型:varchar(10) ‘ Inj text:字符串类型:
Blob:二进制类型:
日期:日期类型,格式为:yyyyy-MM-dd;
时间:时间类型,格式为:hh:mm:ss
Datetime:日期时间类型 yyyy-M-dd hh:mm:Ss
注意点:在mysql中,字符串类型和日期类型都要用单引号括起来。‘Inj’ ‘2022-02-02’
05 数据库的创建
电脑数据的编码,gbk存,utf8存?,创建的时候应该指定编码
创建数据库
注意关键字
查看数据库
查看数据库全局默认编码
查看一个数据库编码
| test1 | CREATE DATABASEtest1
/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci / /!80016 DEFAULT ENCRYPTION='N' */ |
06 数据库的删除
删除数据库
07 数据库的修改和查看
修改数据库的字符集
查看数据库
08 表的增删改查
注意 : 需要制定一个数据库
查看数据库中的表
创建表
查看制定表的结构
09 删除表
制定一个表
删除表
10 修改表
修改表名
添加字段
- alter table person add age int;
- alter table person add score float first;
- alter table person add phone int after name;
删除字段
修改字段
1.修改数据类型
2.修改字段名称和数据类型
11 存储引擎
MySQL中有三种存储引擎,分别是:
- MyISAM:安全性低,但不支持事务和外键,适合频繁插入和查询的应用
- InnoDB(默认):安全性高,支持事务和外键,适合对安全性,数据完整性要求较高的应用
- Memory:访问速度极快,但不会永久存储数据,适合对读写速度要求较高的应用
不同引擎的本质
数据库的本质就是文件,只要创建一个数据库,就会创建文件夹
创建一张表,就会在指定数据库目录创建一个文件,这个文件会保存结构
引擎 | 内容 | 存储文件 |
InnoDB | 创建表就会自动创建一个文件
.ibd 保存了这张表的结构 | ibdata1,ibdata2 |
MyISAM | 自动创建三个文件
.sdi 表的结构
.MYD 表中存储的数据
.MYI 表中索引 | .MYD文件 |
Memory | 创建.sdi文件,保存结构信息
将数据保存在内存中 | 内存 |
修改表的存储引擎
12 插入 更新数据
插入数据
查看数据
更新数据
13 查询表数据
全部
指定字段
where 支持的运算符
比如
14 删除表数据
删除数据
删除所有的数据
15 navicat
16 数据类型
根据数据类型分配存储空间,正确的数据类型,可以合理分配存储空间,完整保存数据,更好的对数据库进行优化。
MySQL中有哪些数据类型?
整型类型
- 数字分为有符号还是无符号
- 超出返回会报错
- 默认为有符号 数据类型加上unsigned 变为无符号的
- 设置位宽
设置位宽
无符号的类型指定
浮点类型
- 占用空间不一样
- 小数的位数不同
- 保存数据的有效精度不同
创建的时候指定小数位数
定点类型
将数据分为证书和小数部分来存储,每个部分都是整数,精确存储,比较费资源
字符类型
- 保存的数据的容量不一样
- char不会回收多余的字符,要多少给多少
- varchar会回收多余的字符,用多少给多少
- 建议使用单引号
- carchar理论可以存储65535字符,但是会随着当前数据库的字符集改变而改变
- 字符集utf8 一个字占三个字节,65535/3=21845
- 字符集gbk 一个字占两个字节,65535/2=32767
文本类型
mysql中每一行存储的数据大小是有限制的,每一行最多65534字节
大文本类型 可以突破。大文本类型在表中并不会实际占用所能保存的字节数,而是利用10个字节引用了实际保存数据的地址. 占用的只有十个字节,存的是真实地址。
枚举类型
如果某个字段值只能取固定的某些值,几个固定值之中的几个
底层是通过整型来实现的
和其他的变成语言不通,其他的枚举是从0开始,mysql是从1开始.
因此也可以通过整数的形式去设置
集合类型
几个固定值中的几个
mysql也是通过整数的形式实现的
mysql集合类型按照2(n)实现的 方便位运算
日期类型
时间需要单引号扩起来
布尔类型
mysql boolean类型也是整型实现的,0假1真,底层本质是mysql是使用c c++实现,所以非0就是真
boolean 真假
数值类型
17 数据完整性-主键
- 什么是数据的完整性 保证保存到数据库中的数据都是正确的。
- 如何保证数据完整性? 数据的完整性可以分为三类:实体完整性、域完整性、参照完整性
- 实体完整性
- 什么是实体? 表中的一行数据就是一个实体 (entity)
- 如何保证实体完整性? 保证实体完整性就是保证每一行数据的唯一性
- 实体完整性的约束类型
- 主键约束 (primary key)
- 唯一约束(unique)
- 自动增长列 (auto_ increment)
- 主键约束 (primary key)
- 如果某一个字段设置为主键,那么字段的取值不能重复
- 如果设置为主键,不能是nul
- 一张表中只能有一个主键,不能出现多个主键
- 除了可以在字段的数据类型后添加,还可以通过在最后写上primary key(name)
主键用于唯一标识表中的每一条数据,和现实生活中的身份证很像
有效的
特征如下
18 数据完整性-联合主键
联合主键
我们通过将表中的某个永远不重复的字段设置为主键,从而达到保证每一行数据的唯一性(实体完整性)
但是在企业开发中有时候我们可能找不到不重复的字段,此时我们还可以通过联合主键的方式来保证每一行数据的唯一性
联合主键就是同时将多个字段作为一个主键来使用,多个字段的取值的组合不重复
19 数据完整性-唯一约束
唯一约束保证某个字段的值永远不重复
唯一约束和主键约束的异同
- 同:被约束的字段的取值不能重复
- 异:主键在一张表中只有一个,唯一约束可以有多个
- 唯一约束可以为空,主键不能为空
20 数据完整性-自动增长约束
自动增长约束的作用是让某个字段的取值从1开始递增,从而保证实体完整性
必须是主键才可以自动增长
default 或者null 就自动关增长
在企业开发中如何选择主键呢?最少性和稳定性
最少性:能用一个字段作为主键,就不要使用多个字段
稳定性:能用不被操作(修改)的字段作为主键,就不要使用会被操作的字段作为主键
一般情况会定义id字段,并且字段为整形,自动增长,设置为主键
21 实体完整性
没有这些的时候 添加这些
如何修改约束
1.如何修改主键约束
2.如何修改唯一约束
3.如何修改自动增长约束
22 域完整性
1.什么是域?
行数据中的每个单元格都是一个域
2.如何保证域的完整性?
保证域的完整性就是保证每个单元格数据的正确性
使用正确的数据类型
例如:人的年龄不可能超过255岁,而且不能是负数,所以我们就可以使用 TINYINT UNSIGNED
例如:人的性别只能是男/女,所以我们就可以使用枚举类型
例如:要存储比较多的文字,为了保证不超出每一行最大的存储限制,我们就可以使用大文本类型
- 使用非空约束 (not null)
- 使用默认值约束 (default)
非空约束
默认值
注意点null,也不会使用默认值,使用default才会使用
23 表与表之间的关系
1.参照完整性
参照完整性又称引用完整性,主要用于保证多表之间引用关系的正确性
2.为什么要创建多张表?
示例:定义一张表保存2个学生3门课程的成绩
如果将所有的数据都放到一张表中,会出现大量元余数据(学生信息保存)
所以为了降低数据库的体积,提升数据库的效率,我们需要根据自身需求对表进行拆分
3.什么时候会出现冗余数据
表与表之间的关系可以分为三种 一对一、一对多、多对多
3.1 一对一
一般不用拆分
id | name | gender | mateId |
1 | A | 1 | 2 |
2 | B | 0 | 1 |
3 | C | 1 | 4 |
4 | D | 0 | 3 |
3.2 一对多关系
拆
一个人有多辆车,一个班有多个学生,一个人有多门成绩
3.3 多对多关系
拆
一个学生有多个老师,一个老师有多个学生
24 参照完整性
1. 如何保证参照完整性?
默认情况下表与表之间是独立存在的,不会相互影响
也正是因为如此,默认情况下也不会检查表与表之间的依赖关系
所以为了保证表与表之间参照完整性,我们可以通过’外键’来保证参照完整性
2. 什么是外键?
如果一张表中有一个字段指向了别一张表中的主键,就将该字段叫做外键
例如:成绩表中的uid引用了学生表中的id,那么成绩表中的uid我们就称之为外键
后面插入数据的时候会进行检查
3.外键注意点:
- 只有InnoDB的存储引擎才支持外键约束
- 外键的数据类型必须和指向的主键一样
- 在一对多的关系中,外键一般定义在多的一方(一个学生有多门成绩,那么外键定义在成绩表中)
- 定义外键的表我们称之为从表,被外键引用的表我们称之为主表
4. 创建表时定义外键
foreign key(外键字段名称)references 主表名称(主表主键名称)
25 参照完整性
1.如何动态添加外键
2.如何查看外键是谁
注意点
3.如何动态删除外键
26 参照完整性 外键的操作
1.外键的操作
严格操作:(前面讲解的都是严格採作)
- 主表不存在对应数据,从表不允许添加
- 从表引用着数据,主表不允许删除
- 从表引用这数据,主表不允许修改
買空操作(null):
- 在企业开发中,我们可能必须要删除主表中的数据,但是如果主表被删除了从表就不完整了所以在企业开发中,我们可以通过置空操作,在删除主表数据的同时删除从表关联的数据
级联操作 (cascade):
在企业开发中,我们可能必须要修改主表中的数据,但是如果主表被修改了从表就不完整了所以在企业开发中,我们可以通过’级联操作’,在修改主表数据的同时修改从表关联的数据
27 参照完整性 多对多外键-35
28 单表查询-36 结果集、字段别名
1. 单表查询
seleet * from 表名;#查询表中所有数据
selpet 字段1,字段2 from 表名:#查询表中指定宁段数据
select [* || 字段] from 表名 [where 条件];#查询表中满足条件的数据
2.什么是结果集
通过查询语句查询出来的结果我们就称之为结果集
结果集以表的形式将查询的结果返回给我们
注意点:
结果集返回的表和查询的表不是同一张表
被查询的表是真实存在的,是存储在磁盘上的
而结果集不是真实存在的,是存储到内存中的
3. 如何给结果集的字段别名
查询指定字段数据时,我们可以通过as给指定字段取别名
4.什么是字段表达式?
查询数据的时候,除了可以查询指定字段的数据以外,我们还可以查询表达式的结果
5.什么是伪表?
字段表达式虽然能够查询出表达式的结果,但是不符合MySql的规范
所以我们可以通过伪表(dual)的方式让字段表达式符合MySQL的规范
29 模糊查询 37
where
通配符
1.模糊查询格式:
30 单表查询 order by
1.排序 order by
31 聚合函数
1.统计计算
2.数值类
3.字符串类
32 数据分组
1. 数据分组 group by
注意点
- 在对数据进行分组的时候,select 后面必须是分组字段或者聚合函数,否则就只会返回第一条数据
33 条件查询 having
having和where很像都是用来做条件查询的
但是where是去数据库中查询符合条件的数据,而having是去结果集中查询符合条件的数据
34 数据分页
1.分页 limit:
35 查询选项
select[查询选项]字段名称 from 表名:
注意
如果是通过distinct来对结果集中重复的数据进行去重,那么只有所有列的数据都相同才会去重
36 多表查询
1.多表查询
多表查询只需要在单表查询基础上增加一张表即可
注意点:
默认情况下多表查询的结果是笛卡尔集
2.union
在纵向上将多张表的结果结合起来返回给我们
注意
- 使用union进行多表查询,返回的结果集的表头的名称是第一张表的名称
- 使用union进行多表查询,必须保证多张表查询的字段个数一致
- 使用union进行多表查询,默认情况下会自动去重
- 使用union进行多表查询,如果不想自动去重,那么可以在union后面加上all
37 表的连接
1.表的连接查询
将多张表中’关联的字段’’连接’在一起查询我们称之为’表的连接查询’
大白话:查询多张表中满足条件的数据
1.1内连接 inner join
在内连接中只会返回满足条件的数据
在进行多表查询的时候,如果想查询指定的字段,那么必须在字段名称前面加上表名才行
1.2外连接
1.2.1左外连接 left join
在左外连接中,左边的表是不看条件的,无论条件是否满足,都会返回左边表中所有的数据
在左外连接中,只有右边的表会看条件,对于右边的表而言,只有满足条件才会返回对应的数据
1.2.2右外连接 right join
在右外连接中,左边的表是不看条件的,无论条件是否满足,都会返回左边表中所有的数据
在右外连接中,只有左边的表会看条件,对于左边的表而言,只有满足条件才会返回对应的数据 /
1.3交叉连接 Cross join
如果没有指定条件,那么返回笛卡尔集
如果指定了条件,那么就等价于内连接
1.4全连接 full join (MySQL不支持全连接)
38 自然连接
1.自然连接 (natural)
自然连接是用来简化’内连接和外连接’的
如果多张表需要判断的条件字段名称一致,那么不用编写条件,自然连接会自动判断
1.1自然内连接
注意
- 如果没有指定条件,也没有同名的字段,那么就会返回笛卡尔集
- 在自然连接中,返回的结果集会自动优化,会自动去除重复的判断字段
1.2自然外连接
1.2.1自然左外连接
1.2.1自然右外连接
39 using关键字
using关键字
如果多张表需要判断的条件字段名称一致,那么除了可以使用自然连接来简化以外还可以使用using关键字来简化
1.1内连接
1.2外连接
1.2.1左外连接
1.2.2右外连接
40 子查询
1.子查询
将一个查询语句查询的结果作为另一个查询语句的条件来使用
将一个查询语句查询的结果作为另一个查询语句的表来使用
2。将一个查询语句查询的结果作为另一个查询的条件来使用
2.1标准子查询(返回的结果只有一个)
2.2非标准子查询(返回的结果有多个)
3。 将一个查询语句查询的结果作为另一个查询的表来使用
注意点:
如果要将一个查询语句查询的结果作为另一个查询的表来使用,那么必须给子查询起一个别名
41 事务介绍
银行表
cardId | name | money |
1001 | zs | 1000 |
1002 | ls | 1000 |
ls给zs转账1000
第一种情况:
1。首先从ls的卡上扣除1000块钱
2。然后再给zs的卡上增加1000块钱
第二种情况:
1。首先给zs的卡上增加1000块钱
2。然后再从Is的卡上扣除1000块钱
如果停电了怎么半?会中断
1.事务基木概念
MySQL中的事务主要用于处理容易出错的数据。
事务可以用来维护数据库的完整性,保证成批的 SQL语句要么全部热行,要么全部不执行。
事务用来管理 insert, update, delete 语句
MySQL中只有使用了 Innodb 数据库引擎的表才支持事务。
42 事务原理和使用
事物语法
开启事务:start transaction
提交事务:commit
回滚事务:rollback
3.示例一:
第一种:先扣再增加
第二种:先增加再扣
使用事物
注意点:
事务的本质是开启事务的时候拷贝一张一模一样的表
然后执行相关的操作都是在拷贝的这张表中做操作
如果失败了,如果执行了rollback,那么系统就会自动删除拷贝的这张表
所以失败了不会影响到原有的数据
如果成功了,如果扒行了comnit,那么系统就会自动利用拷贝表中最新的数据後盖原有表中的数据所以成功了会影响到原有的数据
43 事务回滚点
事务回滚点
记住需要commit
44 事务特点
事务特点:
1.原子性(关注的是状态):
事务开启后的所有操作,要么全部成功,要么全部失败,不可能出现部分成功的情况事务扒行过程中如果出错,哪怕我们不手动回滚,系统也会自动帮我们回滚
2.一致性(关注数据可见性):
事务开始前和结束后,数据库的完整性约束没有被破坏
例如 A向B转账,不可能A扣了钱,B却没收到
3.持久性:
事务完成后,事务对数据库的所有操作是永久的,操作完成之后就不能再回滚
4.隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改的能力, 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
45 事务隔离级别
1.事务隔离级别
读未提交(read uncommitted):一个事务可以读取另一个未提交事务的数据
读提交(read committed):一个事务要等另一个事务提交后才能读取数据
可重复读(repeatable read):一个事务范围内多个相同的查询返回相同的结果
申行化(serializable):前面一个事务没有执行完后面一个事务不能执行
查看隔离级别:
全局的:select @@global. transaction_ isolation;
当前会话的:select @@transaction_ isolation:
设置隔离级别:
全局的:set global transaction isolation level 级别名称;
当前会话:set session transaction isolation level 级别名称:
脏读
能读取到其它事务没有提交的数据示例:
A客户端:
B客户端:
解决办法:读提交 read committed
不可重复读
一个事务范围内多次查询的结果不同示例:
A客户端:
B客户端:
解决办法:可重复读
重复读
一个事务范围内多次查询的结果相同 A客户端:
B客户端:
幻读的问题,改为串行化
串行化
保证永远的都是这个正确的,但是性能比较低
幻读
读到到的结果并不是最终的结果
B客户端:
事务隔离级别对应关系
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
46 视图基本概念
1.视图基本概念
视图本质就是将结果集缓存起来
由于结果集是一张虚拟的表,所以视图也是一张虚拟的表由于结果集是建立在表的基础上的,所以视图也是建立在表的基础上的
2.视图的作用:
视图可以用来简化SQL语句
视图可以用来隐藏表的结构
视图可以用来提升数据安全性
3.创建视图语法
46 视图基本操作
1.视图数据操作
注意点:
由于视图保存的是结果集,由于结果集是基于原始表的所以操作视图中的数据,本质上操作的是原始表中的数据,在原来的数据里面也会看到
2.修改视图内容
- 删除视图
47 创建视图完整语句
1.视图完整语句
2。 视图算法
merge:合并式(替代式)算法
将视图的语句和外层的语句合并之后再执行
改算法允许更新数据
temptable:临时表(具代式)算法
将视图生成一个临时表,再执行外层的语句
该算法不允许更新数据
undefined:未定义算法,默认
由MySQL自己决定使用如上的哪一种算法,默认就是undefined
一般情况下会自动选择merge算法
3.视图限制(with check option)
在with check option的选项下,可以总结为
1.要保证数据update之后也要符合where的条件
2.要保证insert之后的数据能被视图查询出来
3.对于delete,有无 with check option都一样
4.对于没有where字句的视图,使用with check option是多余的
默认情况下哪怕插入的数据和更新的数据不符合创建视图条件,我们也是可以通过视图来插入和更新的
如果想让插入和更新的数据必须符合创建视图的条件,那么就可以在创建视图的时候添加限制条件
48 更新视图
视图更新限制
1.1如果视图的算法是merge 算法,那么可以更新视图
1.2如果没有指vith check option,那么无论数据符不符合创建视图条件都可以更新
1.3如果指定了with check option,那么只有符合创建视图条件才可以更新
1.4除此之外由于视图是一张虚拟表,视图是基于原始表的,更新视图的本质就是更新原始表所以只有原始表中存在的原始数据才可以更新,通过其它方式生成的数据都不可以更新
2.更新限制
聚合函数
DISTINCT关键字
GROUP BY子句
HAVING子句
UNION运算符
FROM子句包含多张表
SELECT语句中应用了不可更新的形势图
49 Mysql预处理
1.预处理:
所谓的预处理技术,最初也是由MySQL提出的一种减轻服务器压力的一种技术!
传统mysql 处理流程
1.在客户端准备sql语句
2.发送sql语句到MySQL服务器
3.MySQL服务器对sql语句进行解析(词法,语法),然后编译,然后执行该sql语句
4.服务器将执行结果返回给客户端
弊端:
哪怕多次传递的语句大部分内容都是相同的,每次还是要重复传递
哪怕语句是相同的,每次执行之前还是要先解析、编译之后才能执行
预处理的处理流程
1.在客户端准备预处理sql语句
2.发送预处理sql语句到MySQL服务器
3.MySQL服务器对预处理sql语句进行解析(词法,语法),但不会执行
4.在客户端准备相关数据
5.MySQL服务器对数据和预处理sql编译,然后执行该sql语句
6.服务器将执行结果返回给客户端
优点:
只对sql语句进行了一次解析
重复内容大大减少(网络传输更快)
如何在MySQL中定义变量
全局变量:@变量名称
给变量赋值:set @变量名称=值:
50 Mysql 存储过程
1。 什么是存储过程?
存储过程和其它编程语言的函数很像,可以用于封装一组特定功能的SQL语句集
用户通过’call 存储过程的名称()’来调用执行它。
2. 存储过程基本语法
2.1定义
2.2调用
3.查看存储过程
3.1查看MySQL中所有存储过程
3.2查看指定数据库中的存储过程
3.3查看指定存储过程的源代码
4.删除存储过程
51 Mysql 变量存储
1.如何在MySQL中定义变量
全局变量
定义:@变量名称;
赋值:
局部变量
定义:declare 变量名称 数据类型:
赋值:set 局部变量名称=值;
2.全局变量
3.局部变量
局部变量只能在存储过程和函数中定义,所以也称之为存储过程变量
default 可以设置默认值
52 Mysql 储存过程深入
1.存储过程参数:
MySQL存储过程中的参数分为:
in 输入参数[默认]
out 输出参数
inout 输入输出参数
示例一:输入参数
外界传递给我们的参数
示例二:输出参数
存储过程中返回给外界的参数
MySQL存储过程中不能使用return返回值,需要通过参数来向外返回值
示例三:输入输出参数
同时具备了输入参数和输出参数所有功能
53 自定义函数
1.什么是自定义函数
自定义函数和存储过程很像,只不过自定义函数不需要手动通过call调用
而是和其它的聚合函数一样会在SQL语句中自动被调用
例如:select avg (score) from stu
例如:select count (*) from stu where age >=18;
2.创建自定义函数
函数特征
1.DETERMINISTIC 不确定的
2.NO SQL 没有SQl语句,当然也不会修改数据
3.READS SQL DATA 只是读取数据,不会修改数据
4.MODIFIES SQL DATA 要修改数据 5 CONTAINS SOL 包含了SQL语句
3.调用函数
53 条件语句
1.IF语
示例一:
示例二:
2.CASE语句
3.循环语句
示例:1+ n的和/ 1+ 2+3+4+5
repeat 循环
示例:
53 批量数据处理
需求:往数据库里存储一万条数据实现方案:
1.写一万条insert into语句
2.将insert into语句封装到存储过程或者函数中
将来怎么使用?
是配合其它SQL语句使用,还是单独使用
单独使用--存储过程
配合其它SQL语句使用一-自定义函数
注意点:
以上封装存在的问题,默认情况下每生成一条插入语句,就会立即执行这条插入的语句
所以整个过程我们生成了一万条插入语句,我们解析了一万条插入的语句,编译了一万条语句,执行了一万条语句,所以比较耗时
优化方式1
set autocommit=0; commit;
等到循环结束以后再去执行sql语句
注意点:
只要在循环前面加上set autocommit = 0;,在循环后面加上commit;
那么就不会生成一条插入语句就执行一条插入语句了
会等到所有的插入语句都生成之后,再统一的解析,统一的编译,统一的执行
优化方式2
预处理不能使用局部变量
两者结合
54 Mysql 索引介绍
1.什么是索引
索引就相当于字典中的目录(拼音/偏旁部首手)
有了目录我们就能通过目录快速的找到想要的结果,
但是如果没有目录(拼音/偏旁部首手),没有索引
那么如果想要查找某条数据就必须从前往后一条一条的查找
所以索引就是用于帮助我们提升数据的查询速度的
2.索引的优缺点和使用原则
2.1优点
- 大大加快数据的查询速度
- 没有任何限制,所有Mysql字段都可以用作索引
2.2缺点
- 索引是真实存在的会占空间,会增加数据库体积
- 如果对作为索引的字段进行增删修操作,系统需要花费时间去更新维护索引
2.3原则
- 对经常用于查询的字段应该创建索引(作为where条件字段、作为group by分组的字段,作为order by排序的字段)
- 对于主键和外键系统会自动创建索引,无序我们手动创建
- 对于数据量小的表不需要刻意使用索引
3.索引分类
- 单值索引:将某个字段的值作为索引
- 复合索引:将多个字段的值作为索引
- 唯一索引(唯一键):索引列中的值必须是唯一的,但是允许为空值
- 主键索引:是一种特殊的唯一索引,不允许有空值
55 索引的创建和修改
1.查看当前查询是否使用索引
1.1查询没有索引的表
1.2查询有索引的表
1.3如何查看当前的查询语句有没有用到素引
如果返回的结果集中的key有值,那么就表示当前的查询语句中用到了索引
如果返回的结果集中的key没有值,那么就表示当前的查询语句中没有用到索引
2.如何添加索引
2.1给表设置主键,只要设置了主键,那么系统就会自动创建对应的索引
2.2给表设置外键,只要设置了外键,那么系统就会自动创建对应的索引
2.3给表设置唯一键,只要设置了某一个字段的取值是唯一的,也会自动创建对应的索引
2.4创建表的时候指定给哪个字段添加索引
2.5创建好表之后再给指定字段添加索引
3.删除索引
56 索引算法
1.什么是索引算法?
索引算法决定了如何创建索引
索引算法决定了如何查找索引对应的数据
传统查找
1, 2, 3, 4, 5
btree查找
平衡的多叉树
BTree索引是基于平衡多叉排序树实现的,能够缩短查找的次数
Hahs索引
哈希索引是基于哈希表实现的,只能用于memory存储引擎,可以一次性定位到指定数据
57 Node与Mysql
1.如何在Node程序中操作MySOL数据库?
我们都知道操作MySQL数据库就是连接MySQL服务器,给MySQL服务器发送指令在NodeJS中我们可以借助第三方库来连接MySQL服务器,给MySQL服务器发送指令
1.1 mysql驱动库
1.2 mysal2驱动库
2。由于node第三方库还不支持最新的mysql加密,所以我们需要修改为旧版本加密方式
2.1、更改加密方式:
2.2、更改密码:该例子中123为新密码
58 Sequelize
1.什么是Sequelize?
Sequelize是一个基于Promise的NodeJS ORM模块
2.什么是ORM?
ORM (Object-Relational-Mapping) 是对象关系映射
对象关系映射可以把JS中的类和对象,和数据库中的表和数据进行关系映射映射
之后我们就可以直接通过类和对象来操作数据表和数据了,就不用编写SQL
ORM有效的解决了直接在NodeJS中编写SQL不够直观,不够高效,容易出错等问题
3.如何映射?
在Sequelize中Js中的一个类(一个模型) 就对应数据库中的一张表
在Sequelize中JS中的一个对象就对应表中的一条数据(一条记录)
在Sequelize中Js中的一个对象的属性就对应一条数据的一个字段
59 Sequelize基本使用
1.Sequelize基本使用
2.什么是数据库连接池?
默认情况下有一个人要使用数据库,那么就必须创建一个连接
默认情况下有一个人不用数据库了,为了不占用资源,那么就必须销毁一个连接
但是频繁的创建和销毁连接是非常消耗服务器性能的,所以为了提升服务器性能就有了连接池
数据库连接池是负责分配、管理和释放数据库连接
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
60 Sequelize创建表
1.sequelize在根据模型创建表的时候,会自动将我们指定的表的名称变成复数
2.sequelize在根据模型创建表的时候,会自动增加两个字段 createAt/updateAt
61 Sequelize-CLI创建数据库
1.什么是Sequelize-CLI?
在编程开发中为了能够更好的管理代码,我们可以使用Git来管理我们的代码,
实现对代码变更的追踪,实现在各个不同版本之间切换
在数据库开发中为了能够更好的管理数据库,我们也可以使用数据库迁移工具来管理我们的数据库, 实现对数据库变更的追踪,实现在各个不同版本之间切换
Sequelize-CLI就是一款数据库迁移工具,能够让我们追踪数据库的变更,在各个不同版本之间随意切换
2.如何使用Sequelize-CLI?
3.初始化Sequelize-CLI
config:数据库配置文件,用于告诉CLI如何连接数据库
models:数据库模型文件,用于告诉CLI如何创建表
migrations:数据库迁移文件,用于记录用户不同版本操作
seeders:数据库种子文件,用于编写测试数据
修改环境变量
4.创建
62 Sequelize-CLI创建表
1.创建模型
2.根据模型创建表
3.回退到某个时刻
63 Sequelize-CLI修改表
1.如何修改表?
使用Sequelize-CL1管理数据库的目的就是为了监控数据库的变化所以我们不能直接修改表的结构,如果要修改,必须通过migration文件修改这样我们就能记录修改操作,就能追踪修改过程,就能回退到指定版本
2.修改表步骤
2.1 通过 migration:generate 创建迁移文件
2.2 在迁移文件中编写修改的内容
2.3 通过 db:migrate 执行编写好的迁移文件
- 作者:Kitety
- 链接:https://www.kitety.com/article/mysql-study-note
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章