• MySQL学习笔记


    MySQL

    MySQL1

    1.MySQL基础3

    1.1.数据库概述3

    1.1.1.基础概述3

    1.1.2.数据库分类3

    1.1.3.关系型数据库3

    1.2.SQL语句5

    1.2.1.定义:结构化查询语言(Structured Query Language),用于数据库增、删、改、查(所有关系型数据库都使用SQL操作数据)5

    1.2.2.特点:每条语句以;结尾,命令关键字不区分大小写,所有符号必须是英文半角符号5

    1.3.数据库操作5

    1.3.1.1.查看已有库:mysql>show databases;5

    1.3.2.2.创建库(指定字符集):mysql>create database 库名 charset=utf8;5

    1.3.3.3.查看某个库的结构:mysql>show create database 库名;5

    1.3.4.4.查看当前所在库是哪个:mysql>select database();5

    1.3.5.5.切换当前库:mysql>use 库名;5

    1.3.6.6.删除库:mysql>drop database 库名;5

    1.3.7.7.库名的命名规则5

    1.4.数据表操作6

    1.4.1.数据表的设计思路6

    1.4.2.字段类型6

    1.4.3.字段属性9

    1.4.4.数据表操作10

    1.5.数据操作10

    1.5.1.表记录(一行)的增、删、改、查11

    1.5.2.表字段(一列)的增、删、改、查14

    1.6.数据库备份14

    1.6.1.终端操作14

    1.6.2.MySQL操作15

    1.7.Python操作MySQL数据库操作16

    1.7.1.pymysql安装:sudo pip3 install pymysql16

    1.7.2.数据库读写概念16

    1.7.3.pymysql操作流程16

    2.MySQL高级17

    2.1.MySQL普通查询-单表17

    2.1.1.3.select ...聚合函数 from 表名18

    2.1.2.1.where ...筛选18

    2.1.3.2.group by ...分组18

    2.1.4.4.having ...18

    2.1.5.5.order by ...排序(一定排倒数第二)19

    2.1.6.6.limit ...;限定结果显示个数(一定排最后)19

    2.1.7.distinct关键字19

    2.1.8.对查询结果的数学运算19

    2.1.9.嵌套查询19

    2.2.MySQL索引查询20

    2.2.1.索引概述20

    2.2.2.索引类型22

    2.2.3.SQL命令运行时间监测24

    2.3.MySQL多表操作24

    2.3.1.外键24

    2.3.2.多表查询25

    2.3.3.表的复制27

    2.4.MySQL存储引擎27

    2.4.1.锁的概念27

    2.4.2.mysql事物28

    2.4.3.存储引擎29

    2.5.E-R模型31

    2.5.1.定义:实体-关系 数据模型,用于数据库设计31

    2.5.2.E-R图31

    2.6.MySQL调优32

    2.6.1.1.选择存储引擎32

    2.6.2.2.在select、where、order by常涉及字段设置索引32

    2.6.3.3.SQL语句优化32

     

    1. MySQL基础

    1.1. 数据库概述

    1.1.1. 基础概述

    数据库:在数据库管理系统管理和控制下,在一定介质(硬盘)上的数据集合、数据仓库

    数据库管理系统:管理数据库的软件(mysql),用于管理和维护数据库

    MySQL数据库:由MySQL软件建立的数据库

    1.1.2. 数据库分类

    关系型:采用关系模型(行列组成的二维表)来组织数据结构的数据库,MySQL、Oracle(目前最大的,收购了msql)、SQLite、SQL_server(微软开发的)

    非关系型:不采用关系模型组织数据结构的数据库

    1.1.3. 关系型数据库

    数据库结构:数据元素-->记录(行),字段(列)-->数据表-->数据库

    数据表:存放数据的二维表格
    字段:二维表的每一列,用来表示该列数据的含义
    记录:二维表的一行,表示一组完整的数据,可以说数据表是有每一条记录组成的

    MySQL特点

    关系型数据库
    可跨平台
    支持多种编程语言(python、java、php)
    基于磁盘存储,数据是以文件形式存放在数据库目录/var/lib/mysql下

    MySQL安装

    Ubuntu
    安装服务端:sudo apt-get install mysql-server
    安装客户端:sudo apt-get install mysql-client
    Windows
    MySQL官网

    MySQL启动和连接

    服务端启动:sudo etc/init.d/mysql status|start|stop|restart
        sudo service mysql start|stop|restart|status
    status查看状态
    start启动
    stop关闭
    restart重启
    客户端连接:mysql -h主机地址 -u用户名 -p密码
    本地连接:mysql -uroot -p123456
    断开连接:ctrl+d或exit

    1.2. SQL语句

    1.2.1. 定义:结构化查询语言(Structured Query Language),用于数据库增、删、改、查(所有关系型数据库都使用SQL操作数据)

    1.2.2. 特点:每条语句以;结尾,命令关键字不区分大小写,所有符号必须是英文半角符号

    1.3. 数据库操作

    1.3.1. 1.查看已有库:mysql>show databases;

    1.3.2. 2.创建库(指定字符集):mysql>create database 库名 charset=utf8;

    1.3.3. 3.查看某个库的结构:mysql>show create database 库名;

    1.3.4. 4.查看当前所在库是哪个:mysql>select database();

    1.3.5. 5.切换当前库:mysql>use 库名;

    1.3.6. 6.删除库:mysql>drop database 库名;

    1.3.7. 7.库名的命名规则

    字母、数字、下划线组成,不能纯数字,不能有除了_外的其他符号

    区分大小写,stu和Stu是两个库

    不能以MySQL关键字命名

    1.4. 数据表操作

    1.4.1. 数据表的设计思路

    分析存储内容

    确定字段构成

    选择字段类型

    1.4.2. 字段类型

    数字型(包含bit比特型)

    整数型:int[4],smallint[2],tinyint[1],bigint[8]
    浮点型:float[4],double[8]
    定点型:decimal(m,d)有m-d位整数和d位小数组成
    比特值型:值为0或1,表达两种情况,如真,假

    字符型

    char()定长字符串:char默认表示1字符,效率高,char(32)字符长度不足32填充空格,注意:mysql取值时会将末尾空格去掉
    varchar()变长字符串:无默认值,参数必填,节省空间,varchar(32)
    text文本类型
    blob二进制字节串
    可用于把隐藏文件(图片、视频等)存在数据库中
    enum枚举型,单选类型:enum('male','female')
    set可复选类型:set('sing','dance','draw')

    时间类型

    类型层面
    date年月日,数据插入格式:'yyyy-mm-dd'
    time时分秒,数据插入格式:'hh:mm:ss'
    datetime年月日时分秒,数据插入格式:'yyyy-mm-dd hh:mm:ss'
    timestamp与datetime显示一致,内部存储是时间戳
    year年
    数据值层面
    MySQL中的时间函数

    now()返回系统当前年月日时分秒,可用于设置datetime类型字段的默认值(default now())

    curdate()返回系统当前年月日,可用于设置date类型字段的默认值(default curdate())

    curtime()返回系统当前时分秒,可用于设置time类型字段的默认值(default curtime())

    time('2:30:25')将字符串'2:30:25'转换为时间

    date('2019-9-22')将字符串'2019-9-22'转换为日期

    时间运算

    时间类型数据的作用:以字符串类型的数据插入,以时间类型进行运算,从而对数据进行筛选操作

    时间间隔 interval 3 year|month|day|hour|minute|second

    举例:

    建表:create table marathon (id int primary key auto_increment,athlete varchar(32),birthday date,registration_time datetime default now(),performance time);

    插入数据:insert into marathon(athlete,birthday,performance) values('lennie','1992-11-23','2:46:36'),('ginger','1994-8-24','2:37:24')...;

    查询

    00后运动员的信息:select * from marathon where birthday>='2000-01-01';

    7天报名的运动员的信息:select * from marathon where registration_time > (now()-interval 7 day);

    成绩差10分钟就能到两个半小时以内的运动员有哪些:select althlete from marathon where performance - time('2:30:00') < interval 10 minute;

    1.4.3. 字段属性

    unsigned:数字类型设置无符号

    not null:设置字段不能为空(不写表示默认可以为空),插入数据时为空就报错

    default:设置字段默认值,插入数据时为空就自动填充默认值

    auto_increment:设置字段为自增,一般用于主键,自带属性默认值每次自动加1

    primary key:设置该字段为主键,主键自带属性不能重复,不能为空

    1.4.4. 数据表操作

    1.创建表:create table 表名(字段1 类型 属性,字段2 类型 属性,...)charset=utf8;

    e.g.:create table interest(id int primary key auto_increment,name varchar(32) not null,age tinyint unsigned,hobby set('sing','dance','draw'),price decimal(6,2),content text) default charset=utf8;

    2.查看已有数据表:show tables;

    3.查看已有表字符集(创建表的sql语句):show create table 表名;

    4.查看数据表结构(表头):desc 表名;

    5.删除表:drop table 表名;

    6.修改表名:alter table 表名 rename 新表名;

    1.5. 数据操作

    1.5.1. 表记录(一行)的增、删、改、查

    1.插入行

    1.insert into 表名 values(记录1),(记录2)...;每条记录中的值必须和所有字段完全对应
    2.insert into 表名(字段2,字段3) values(值2.1,值3.1),(值2.2,值3.2)...;可指定任意不能为空的字段插入数据(不推荐)

    2.删除行:delete from 表名 where 条件;如果不加where所有记录全部清空

    3.更改数据:update 表名 set 字段1=值1,字段2=值2... where 条件;如果不加where,字段1那一列全部改为值1...

    4.查询数据:

    1.select * from 表名 where 条件;不加where显示全表
    2.select 字段1,字段2... from 表名 where 条件;不加where显示全列

    5.where子句

    通过一定的运算表达式对数据进行筛选、定位
    MySQL运算符
    算数运算:+,-,*,/,%
    比较运算:=,!=,<,>,<=,>=,in,not in,between,not between,is null,is not null,like,regexp,<=>

    between 5 and 8:闭区间[5,8]

    in (5,8):集合(5,8)

    is null:为空

    like:模糊查询

    regexp:正则查询

    字段1<=>字段2:字段1,字段2都为null为真否则为假

    逻辑运算:and,or,not或!,xor(异或:相同为0,不同为1)
    位运算

    6.高级查询语句

    like,模糊查询
    运算符(关键字)like
    %表示任意0个或多个字符
    _表示任意单个字符
    举例

    查询名字以A开头的记录:select * from class_1 where name like 'A%';

    查询名字为3个字母的记录:select * from class_1 where name like '___';

    regexp,正则查询不区分大小写
    格式:where 字段名 regexp 'regex'
    举例,查询名字以B开头的记录:select * from class_1 where name regexp '^B.+';
    order by 字段名1 [desc],排序
    使查询结果按照字段1,默认升序排列,desc倒序排列
    可复合排序,如:oder by 字段1,字段2 desc;表示按字段1升序,字段1有相同值时按照字段2降序排列,--->排序嵌套
    limit,限制查询结果显示数量
    limit n:显示结果的前n条
    limit m,n:从m+1条开始,显示n条
    limit (b-1)a,a:查询结果分页显示,每页显示a条,显示第b页的内容
    union distinct[all],联合查询(类似or)
    用于连接两个select语句,使两个查询结果拼接在一起展示,默认distinct去重复,all不去重
    注意:两个查询语句所查询的字段必须一致,否则报错
    举例:查询class_1表中女生,或者成绩大于90分的学生信息(女生成绩小于90的也展示出来)
    mysql>select * from class_1 where sex='m' UNION ALL select * from class_1 where age > 9;

    1.5.2. 表字段(一列)的增、删、改、查

    1.添加字段:alter table 表名  add 新字段名 类型 属性 first|after 旧字段;添加到第一列,添加到某字段后面,不写默认添加到最后

    2.删除字段:alter table 表名 drop 字段名;

    3.修改字段:

    1.修改字段数据类型:alter table 表名 modify 字段名 新数据类型;
    2.修改字段名:alter table 表名 change 旧字段名 新字段名 新类型;

    1.6. 数据库备份

    1.6.1. 终端操作

    说明:

    1.操作对象是.sql文件,即把库导出为.sql文件和把.sql文件导入数据库
    2.操作命令不是sql语句,无需启动mysql,直接在终端操作即可

    数据库导出命令:mysqldump -uroot -p 需要导出的库名 > 路径/xxx.sql

    库名:导出单个库
    --all-databases:导出所有库
    -B 库1 库2 库3 :导出指定的多个库
    库名 1 表2 表3:导出指定库的指定表

    数据库导入命令:mysql -uroot -p 存储导入数据的库名 < xxx.sql

    --one-database:恢复备份数据中的某一个库
    e.g.:mysql -uroot -p --one-database 目标库名 < all.sql

    1.6.2. MySQL操作

    数据导入

    标准.sql文件的导入:mysql>source xxx.sql;
    结构化文件(如.csv文件,内容是按分隔符分开的,一行一行的)的导入
    1.将xxx.csv放到数据库搜索路径中

    1.找到本机中mysql的安全路径:mysql>show variables like 'secure_file_priv';-->/var/lib/mysql-files/

    2.将目标文件复制到安全路径下:Linux: sudo cp /home/用户名/xxx.csv /var/lib/mysql-files/

    2.在数据库中创建对应的表
    3.执行数据导入语句:mysql>load data infile '/var/lib/mysql-files/xxx.csv' into table 表名 fields terminated by ',' lines terminated by ' ';

    数据导出

    说明
    1.导出的内容由SQL查询语句决定,导出格式可自定义,一般导出.csv文件
    2.执行导出命令时路径必须指定在对应的数据库目录下
    语法格式:select ... from 库.表名 into outfile "/var/lib/mysql-files/xxx.csv" fields terminated by "分隔符" lines terminated by " ";

    1.7. Python操作MySQL数据库操作

    1.7.1. pymysql安装:sudo pip3 install pymysql

    1.7.2. 数据库读写概念

    读操作:数据查询

    写操作:数据增、删、改

    1.7.3. pymysql操作流程

    1.建立数据库连接,创建数据库连接对象:db=pymysql.connect(参数信息)

    host:主机地址,本地localhost
    port :端口号,mysql服务器默认监听端口号3306,除了端口号,其他参数都要加引号
    user :用户名
    password :密码
    database :库名
    charset :编码方式,推荐使用 utf8

    2. 创建游标对象(cur = db.cursor())

    3. 游标方法: cur.execute("insert ....")

    1.cur.execute(sql命令,[列表]) 执行SQL命令  --SQL语句是字符串,[]列表可用于格式化字符串传值
    2.cur.fetchone() 获取查询结果集的第一条数据,查找到返回一个元组否则返回None
    3.cur.fetchmany(n) 获取前n条查找到的记录,返回结果为元组嵌套元组, ((记录1),(记录2))。
    4.cur.fetchall() 获取所有查找到的记录,返回结果形式同上。
    5.cur.close() 关闭游标对象

    4. 提交到数据库或者获取数据(数据的增、删、改需要同步才能成功) : db.commit()/cur.fetchall()

    1.cur = db.cursor() 返回游标对象,用于执行具体SQL命令
    2.db.commit() 提交到数据库执行
    3.db.rollback() 回滚,用于当commit()出错是回复到原来的数据形态
    4.db.close() 关闭连接

    5. 关闭游标对象 :cur.close()

    6. 断开数据库连接 :db.close()

    2. MySQL高级

    2.1. MySQL普通查询-单表

    2.1.1. 3.select ...聚合函数 from 表名

    规律:聚合函数输出结果为一个

    聚合函数

    avg(字段名) :该字段的平均值
    max(字段名):该字段的最大值
    min(字段名):该字段的最小值
    sum(字段名):该字段所有记录的和
    count(字段名):统计该字段记录的个数 (null不能被统计)

    2.1.2. 1.where ...筛选

    where只能操作表中实际存在的字段

    2.1.3. 2.group by ...分组

    作用:对查询的结果进行分组(去重复)显示,通常与聚合函数联合使用

    规律:

    1.group by 后面的字段必须是select后面的字段之一,
    2.查询字段和group by后面的字段不一致,则必须对该字段进行聚合处理(聚合函数)

    2.1.4. 4.having ...

    作用:对分组或者聚合后的结果进一步的筛选,类似where子句,但是弥补了where关键字不能与聚合函数联合使用的不足,通常与group by 联合使用

    where的区别:where只能操作表中实际存在的字段,having操作的是聚合函数生成的显示字段

    2.1.5. 5.order by ...排序(一定排倒数第二)

    2.1.6. 6.limit ...;限定结果显示个数(一定排最后)

    2.1.7. distinct关键字

    语法:select distinct 字段1 from 表名

    作用:去重复,效果和group by一致,e.g. : sanguo表中都有哪些国家:

    select country from sanguo group by country;
    select distinct country from sanguo;

    规律:

    1.distinct对多个字段去重复时,由该几个字段构成的每一行必须是完全一样的才能去重复
    2.distinct不能对任何字段做聚合处理,即注意区分去重复与聚合概念的区别

    2.1.8. 对查询结果的数学运算

    作用:对查询结果翻倍、加1等显示,对表中原数据没有做修改

    运算符:+,-,*,/,%,**

    举例:查询时显示攻击力翻倍--->select attack*2 from sanguo;

    2.1.9. 嵌套查询

    定义:把内层(括号内)的查询结果作为外层的查询条件

    语法:select ... from 表名 where 条件(select ....);

    2.2. MySQL索引查询

    2.2.1. 索引概述

    定义:索引是对数据库表的一列或者多列进行排序的一种数据结构(B+树)

    二叉查找树
    特点:一个结点只存储一个数据,左子树一定比右子树小
    举例:查找数字6,需要经过四次磁盘IO(9->5->7->6)
    B树
    1.每个节点能存储多个索引和数据(键值对),存储海量数据时相对二叉树可以降低树的高度,从而减少磁盘IO次数.
    2.但由于每个节点存储了数据,根据索引进行范围查询时效率并不高
    B+树
    1.除叶子节点外,节点内只存索引(主键),不储数据(记录),从而单个节点能存储的索引数量远远大于B树,有大量索引重复存储;
    2.所有数据均存储在叶子节点中,并且有序的相连,范围查询时效果最棒!

    mysql数据库索引采用B(B+)树模型的原因?

    1.叶子结点存数据,其他节点存索引,可降低树的高度,减少磁盘IO次数
    2.叶子节点有序相连,适合范围查询

    优缺点

    优点:查询速度极快,千万级的数据查询,只需要经历3-4次磁盘IO
    缺点
    1.索引需要额外占用物理存储空间(虽然不多)
    2.对数据库写操作(增删改)时,索引需要动态维护,降低数据维护速度(对于存储海量数据的数据仓库,侧重数据分析和数据挖掘,供企业决策分析之用,主要是数据查询,修改和删除很少)

    2.2.2. 索引类型

    说明:

    1.索引可设置多个字段
    2.哪些字段创建索引:经常用来查询的字段、where条件判断字段、order by排序字段

    索引分类

    1.普通索引(index) :字段值无约束,KEY标志为 MUL
    2.唯一索引(unique) :字段值不允许重复,但可为 NULL,KEY标志为 UNI
    3.主键(primary key):字段值不允许重复,且不能为NULL,只能有一个主键字段,KEY标志为 PRI,通常设置记录编号字段id,能唯一锁定一条记录

    索引创建和删除

    MUL和UNI
    创建

    创建表时

    作为字段属性:字段名 index/unique

    作为字段:index/unique(字段名)

    已有表中创建:create index/unique 索引名 on 表名(字段名);索引名默认与字段名一致

    查看索引

    desc 表名;-->KEY标志:MUL,UNI

    show index from 表名G;

    删除:drop index 索引名 on 表名;只能一个一个删
    PRI和自增属性
    创建

    创建表时

    作为字段属性:字段名 primary key auto_increment

    作为字段:create table 表名(id int auto_increment,...,primary key(id))charset=utf8,auto_increment=1000;设置自增起始值

    已有表中创建主键:alter table 表名 add primary key(id)

    已有表中设置自增起始值:alter table 表名 auto_increment=2000;

    删除

    删除主键:alter table 表名 drop primary key;

    删除自增属性:alter table 表名 modify id int;

    2.2.3. SQL命令运行时间监测

    ​mysql>show variables like '%pro%';

    ​    1.开启 :mysql> set profiling=1;

    ​    2.查看 :mysql> show profiles;

    ​    3.关闭 :mysql> set profiling=0;

    2.3. MySQL多表操作

    2.3.1. 外键

    定义:让当前表字段的值只能在另一个表字段值的范围内选择,表之间的一种关联关系

    使用规则:

    1.主表、从表(设置外键的表)字段数据类型要一致
    2.主表被参考字段必须设置了KEY(索引)的一种,一般为主键

    添加外键(类似于创建字段)

    创建表时:create table 从表名(。。。,foreign key(参考字段名) references 主表名(被参考字段名) on delete 级联动作 on update 级联动作)charset=utf8;
    已有表中:alter table 从表名 add foreign key(从表已有字段) references 主表名(被参考字段) on delete 级联动作 on update 级联动作

    删除外键(类似于删除字段):alter table 表名 drop foreign key 外键名;外键名默认与字段名一致

    查看外键:show create table 表名;

    级联动作

    cascade:从表中的数据随着主表中的数据变化而变化(删除、更新),
    restrict(默认):从表有相关联记录,不允许主表操作
    set null:主表删除、更新,从表对应关联字段值为NULL

    2.3.2. 多表查询

    前提:表之间有关联关系。如:有三个表,省表,市表,县表,县表字段co_cid关联市表字段cid,市表ci_pid关联省表字段pid,但并非完全关联

    笛卡尔积

    select 表1.字段1,表2.字段1 from 表1,表2;
    说明:显示行数为两个字段值数量的乘积,当数据量庞大时,会非常耗费计算机资源,查询时应尽量避免此类查询

    多表查询

    语法格式:select 字段名列表 from 表名列表 where 条件;
    举例:查询省市县详细信息(省有哪些市,市有哪些县):select province.pame,city.cname,county.coname from province,city,county where province.pid=city.cp_id and city.cid=county.copid;

    连接查询

    内连接,适用于多表之间完全关联(外键)的情形
    功能与多表查询一致,mysql官方推荐使用此命令进行多表查询
    语法格式:select 字段名列表 from  表1(主表) inner join 表2(从表) on 条件 inner join 表3(从从表) on 条件;
    举例:查询省市县详细信息(省有哪些市,市有哪些县):select province.pname,city.cname,county.coname from province inner join city on province.pid=city.cp_id inner join county on city.cid=county.copid;
    外连接,适用于多表之间并非完全关联的情形
    左外链接

    左表 为主显示查询结果,右表没有对应显示null

    语法格式:select 字段名列表 from 表1 left join 表2 on 条件 left join 表3 on 条件;

    举例:查询省、市详细信息(要求省全部显示):select province.pname,city.cname from province left join city on province.pid=city.cp_id;

    右外连接

    右表 为主显示查询结果,左表没有对应显示null

    语法格式:select 字段名列表 from 表1 right join 表2 on 条件 right join 表3 on 条件;

    举例:查询省、市详细信息(要求市全部显示):select province.pname,city.cname from province right join city on province.pid=city.cp_id;

    2.3.3. 表的复制

    复制表数据

    说明
    1.表能根据实际需求复制数据
    2.复制表时不会把KEY属性复制过来
    语法格式:create table 副本表名 select ... from 库.主表名 [where 条件];

    复制表结构(表头):create table 副本表名 select ... from 库.主表名 where faulse;

    2.4. MySQL存储引擎

    2.4.1. 锁的概念

    数据库加锁的目的:解决客户端并发访问的冲突问题

    锁类型

    读锁(共享锁):加读锁之后可以进行查(读)操作,不能进行增删改(写)操作
    写锁(互斥锁、排他锁):加写锁之后,不能读,不能写

    锁粒度

    行及锁:只锁定一行
    表及锁:锁定整个表

    注意:手动加锁需谨慎,尽量使用MySQL内部功能(如存储引擎)自动加锁和释放锁,从而避免死锁

    2.4.2. mysql事物

    定义:一次表记录操作(删、改、查)从开始到结束的过程(所有sql语句的集合)

    作用:一条或多条sql语句同时执行时,维护数据的一致性、准确性、有效性

    说明:

    1.在MySQL命令行的默认设置下,事务都是自动提交的,因此要显式地开启一个事务来禁止当前自动提交。
    2.事务只针对于表记录操作有效,对于库和表的操作无效
    3.事务一旦提交结束,对数据库中数据的更改是永久性的
    4.事物操作的前提:数据库采用的InnoDB存储引擎

    一次事物的操作过程

    1.开启事务
    方式1:mysql>begin;
    方式2:mysql>start transaction;
    2.执行1条或多条sql语句
    3.关闭事物
    方式1:mysql>commit; # 提交并结束事务,并使已对表记录进行的所有修改成为永久性的
    方式2:mysql>rollback; # 回滚并结束事务,并撤销正在进行的所有未提交的修改

    事物的四大特性ACID

    原子性atomicity:事物是最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚
    一致性consistency:数据库总是从一个一致性的状态转换到另一个一致性的状态
    隔离性isolation:一个事务所做的修改在最终提交以前,对其他事务是不可见的
    持久性durability:一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失

    2.4.3. 存储引擎

    定义:处理数据库操作的处理器,表存储数据的方式(技术),也叫表类型.

    基本操作

    1.查看所有存储引擎:mysql> show engines;
    2.查看已有表的存储引擎:mysql> show create table 表名;
    3.指定引擎--默认InnoDB
    1.创建表时:create table 表名(...)engine=MyISAM,charset=utf8,auto_increment=10000;
    2.已有表中:alter table 表名 engine=InnoDB;

    三种常用的存储引擎

    InnoDB
    1.支持行级锁(锁了一行,不影响其他行的操作)
    2.支持外键、事务、事务回滚(如银行转账失败回滚,账户充值失败回滚)
    3.表数据和索引同存储在一个文件中

    表名.frm :表结构

    表名.ibd : 表记录及索引文件  ##B树

    4.适用场景:要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制--执行写操作多的表
    MyISAM
    1.支持表级锁
    2.表数据和索引分开存储

    表名.frm :表结构

    表名.MYI : 索引文件(my index)

    表名.MYD : 表记录(my data)  ##B+树

    3.适用场景:用来插入和查询记录时,能提供较高的处理效率--执行读操作多的表
    MEMORY
    1.表记录存储在内存中,效率高
    2.服务或主机重启,表记录清除,容易丢失数据
    3.适用场景:作为临时表,存放查询的中间结果。

    2.5. E-R模型

    2.5.1. 定义:实体-关系 数据模型,用于数据库设计

    2.5.2. E-R图

    实体:矩形框(记录)

    属性:椭圆形框(字段)

    关系:菱形框(实体之间的关联)

    一对一关联:两表任选其一,设置外键关联主表主键,且从表外键字段设置唯一索引
    一对多关联:两表任选其一,设置外键关联主表主键
    多对多关联:创建中间表,设置两个外键字段,分别关联两表的主键

    2.6. MySQL调优

    2.6.1. 1.选择存储引擎

    读操作多:MyISAM

    写操作多:InnoDB

    2.6.2. 2.在select、where、order by常涉及字段设置索引

    2.6.3. 3.SQL语句优化

    1.单条查询最后添加 LIMIT 1,停止全表扫描

    2.where子句中不使用 != ,否则放弃索引全表扫描

    3.尽量避免 NULL 值判断,否则放弃索引全表扫描

    优化前:select number from t1 where number is null;
    优化后:select number from t1 where number=0;# 在number列上设置默认值0,确保number列无NULL值

    4.尽量避免 or 连接条件,否则放弃索引全表扫描

    优化前:select id from t1 where id=10 or id=20;
    优化后:select id from t1 where id=10 union all select id from t1 where id=20;

    5.模糊查询尽量避免使用前置 % ,否则全表扫描

    6.尽量避免使用 in 和 not in,否则全表扫描  

    优化前:select id from t1 where id in(1,2,3,4);
    优化后:select id from t1 where id between 1 and 4;

    7.尽量避免使用 select * ...;用具体字段代替 * ,不要返回用不到的任何字段

  • 相关阅读:
    离线数仓 建模、表的类型分类
    获取每个部门中当前员工薪水最高的相关信息
    dwd层 维度退化 的作用
    单例模式懒汉式
    反汇编命令使用
    RabbitMQ实战高级特性
    初步理解MySQL的gap锁
    【java并发系列】Controller是线程安全吗_ 安全方式如何
    mysql_14_count(*)为什么这么慢
    MySQL 通过Docker搭建主从同步
  • 原文地址:https://www.cnblogs.com/lennie-luo/p/12991307.html
Copyright © 2020-2023  润新知