MySQL学习教程
- 1、初识数据库
- 1.1、什么是数据库
- 1.2、数据库分类
- 1.3、相关概念
- 1.4、基本命令
- 2、操作数据库
- 2.1、操作数据库
- 2.2、数据库的数据类型
- null
- 2.3、数据库的字段属性
- UnSigned
- ZEROFILL
- Auto_InCrement
- NULL 和 NOT NULL
- DEFAULT
- 2.4、创建数据库表
- 2.5、数据库存储引擎
- 2.6、修改数据库
- 3、MySQL数据管理
- 3.1、外键
- 创建外键的方法
- MySQL报错cannot add foreign key constraint解决方法
- 3.2、DML语言
- 1. 添加 insert
- 2. 修改 update
- 3. 删除 delete
- 4、DQL查询数据
- 4.1、基础查询
- 4.2、条件查询
- 4.3、分组查询
- 4.4、连接查询
- 4.5、排序和分页
- 排序
- 分页
- 4.6、子查询
- 4.7、MySQL函数
- 1. 常用函数
- 2. 聚合函数
- 5、数据库级别的MD5加密
- 6、事务
- 6.1、事务原则:ACID
- 原子性
- 一致性(Consistency)
- 持久性(Durability)
- 隔离性(Isolation)
- 6.2、事务并发导致的问题
- 6.3、隔离级别
- 6.4、事务演示
- 案列1:脏读演示,读到其他事务未提交的数据
- 6.5、执行事务的过程
- 7、索引
- 7.1、索引的分类
- 主键索引(PRIMARY KEY)
- 普通索引(KEY / INDEX)
- 唯一索引(UNIQUE KEY)
- 全文索引(FULLText)
- 7.2、索引的使用
- 1. 索引的创建
- 2. 索引的删除
- 3. 显示索引信息
- 4. explain分析sql执行的情况
- 7.3、测试索引
- 测试查询速度
- 7.4、索引原则
- 8、explain关键字
- explain 执行计划包含的信息
- id
- select_type
- type
- possible_keys
- key
- key_len
- ref
- rows
- Extra
- 9、权限管理和备份
- 9.1、用户管理
- 9.2、数据库备份
- 10、三大范式
- 三大范式的通俗理解
- 第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项
- 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
- 11、MyISAM和InnoDB区别
1、初识数据库
1.1、什么是数据库
数据库:DB(DataBase)
概念:数据仓库,软件,安装在操作系统之上
作用:存储数据,管理数据
1.2、数据库分类
关系型数据库:SQL(Structured Query Language)
- MySQL、Oracle、Sql Server、DB2、SQLlite
- 通过表和表之间,行和列之间的关系进行数据的存储
- 通过外键关联来建立表与表之间的关系
非关系型数据库:NoSQL(Not Only SQL)
- Redis、MongoDB
- 指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
1.3、相关概念
DBMS(数据库管理系统)
- 数据库的管理软件,科学有效的管理、维护和获取我们的数据
- MySQL就是数据库管理系统
1.4、基本命令
所有的语句都要以分号结尾
show databases; --查看当前所有的数据库
use 数据库名; --打开指定的数据库
show tables; --查看所有的表
describe/desc 表名; --显示表的信息
create database 数据库名; --创建一个数据库
exit --退出连接
-- --单行注释
# --单行注释
/*...*/ --多行注释
2、操作数据库
2.1、操作数据库
1、创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
2、删除数据库
DROP DATABASE [if EXISTS] 数据库名;
3、使用数据库
--如果表名或者字段名是特殊字符,则需要带``
use 数据库名;
4、查看数据库
SHOW DATABASES;
2.2、数据库的数据类型
null
- 没有值,未知
- 不要使用NULL值进行计算
2.3、数据库的字段属性
UnSigned
无符号的
声明了该列不能为负数
ZEROFILL
0填充的
不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement
通常理解为自增,自动在上一条记录的基础上默认+1
通常用来设计唯一的主键,必须是整数类型
可定义起始值和步长
- 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
- SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
NULL 和 NOT NULL
默认为NULL , 即没有插入该列的数值
如果设置为NOT NULL , 则该列必须有值
DEFAULT
默认的
用于设置默认值
例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
拓展:每一个表,都必须存在以下五个字段:| 名称 | 描述 |
|---|---|
| id | 主键 |
| version | 乐观锁 |
| deleted_at | 伪删除 |
| created_at | 创建时间 |
| updated_at | 修改时间 |
2.4、创建数据库表
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
注意点:
-
表名和字段尽量使用``括起来
-
AUTO_INCREMENT 代表自增
-
所有的语句后面加逗号,最后一个不加
-
字符串使用单引号括起来
-
主键的声明一般放在最后,便于查看
-
不设置字符集编码的话,会使用MySQL默认的字符集编码Latin1,不支持中文,可以在my.ini里修改
格式:
CREATE TABLE IF NOT EXISTS `student`(
'字段名' 列类型 [属性] [索引] [注释],
'字段名' 列类型 [属性] [索引] [注释],
......
'字段名' 列类型 [属性] [索引] [注释]
)[表的类型][字符集设置][注释]
# 常用命令:
SHOW CREATE DATABASE 数据库名;-- 查看创建数据库的语句
SHOW CREATE TABLE 表名;-- 查看表的定义语句
DESC 表名;-- 显示表的具体结构
2.5、数据库存储引擎
INNODB
默认使用,安全性高,支持事务的处理,多表多用户操作
MYISAM
早些年使用,节约空间,速度较快
| MYISAM | INNODB | |
|---|---|---|
| 事务支持 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空间大小 | 较小 | 较大,约为2倍 |
数据库文件存在的物理空间位置:
MySQL数据表以文件方式存放在磁盘中
包括表文件 , 数据文件 , 以及数据库的选项文件
位置 : Mysql安装目录\data\(目录名对应数据库名 , 该目录下文件名对应数据表)
MySQL在文件引擎上区别:
INNODB数据库文件类型就包括**.frm**、.ibd以及在上一级目录的ibdata1文件
MYISAM存储引擎,数据库文件类型就包括
.frm:表结构定义文件
.MYD:数据文件
.MYI:索引文件
2.6、修改数据库
修改表名 : ALTER TABLE 旧表名 RENAME AS 新表名
添加字段 : ALTER TABLE 表名 ADD字段名 列属性[属性]
修改字段 :
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列属性[属性]
删除字段 :ALTER TABLE 表名 DROP 字段名
-- 修改表名
-- ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teachers;
-- 增加表的字段
-- ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teachers ADD age INT(11);
-- 修改表的字段(重命名,修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 [列属性];
ALTER TABLE teachers MODIFY age VARCHAR(11);-- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 [列属性];
ALTER TABLE teachers CHANGE age age1 INT(1);-- 字段重命名
-- 删除表的字段
-- ALTER TABLE 表名 DROP 字段名
ALTER TABLE teachers DROP age1;
语法:DROP TABLE [IF EXISTS] 表名
IF EXISTS为可选 , 判断是否存在该数据表
如删除不存在的数据表会抛出错误
-- 删除表(如果存在再删除)
DROP TABLE IF EXISTS teachers;
所有的创建和删除尽量加上判断,以免报错~
3、MySQL数据管理
3.1、外键
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。
外键作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。
目标:学生表(student)的gradeid字段 要去引用年级表(grade)的 gradeid字段创建外键
方式一:在创建表的时候增加约束
-- 创建年级表
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年纪名称',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
/*
1. 定义外键key
2. 给外键添加约束(执行引用)references 引用
*/
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_student_grade` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)
/*
1. 定义外键key
2. 给外键添加约束(执行引用)references 引用
*/
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建表的时候没有外键关系
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
-- 创建年级表
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年纪名称',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
创建顺序
以上的操作都是物理外键,数据库级别的外键,不建议使用!避免数据库过多造成困扰!
最佳实践
数据库就是用来单纯的表,只用来存数据,只有行(数据)和列(属性)
我们想使用多张表的数据,使用外键,用程序去实现
创建外键的方法
首先谈一下外键的作用,一是节省空间,二是约束含外键的列中的值,含外键列的值必须为参考列中的id。
创建数据表时,创建外键方法
create table department(
id bigint auto_increment primary key,
title char(15)
)engine=innodb default charset=utf8;
create table userinfo(
uid bigint auto_increment primary key, # 创建列uid ,bigint类型,自增,主键
name varchar(32), # 创建列name varchar类型,32位
department_id bigint,
xx_id int,
CONSTRAINT fk_userinfo_department foreign key (department_id) references department(id) #创建外键
)engine=innodb default charset=utf8;
创建外键语法如下
constraint fk_userinfo_department foreign key (department_id) references department(id)
constraint 外键名字 foreign key (添加外键的列名)references 参考表的名称(参考表中的列名)
外键也可以是两列,但是前提条件是,被参考的表的两列均是主键
CREATE TABLE t5 (
nid int(11) NOT NULL AUTO_INCREMENT,
pid int(11) not NULL,
num int(11),
primary key(nid,pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
create table t6(
id int auto_increment primary key,
name char(10),
id1 int,
id2 int,
CONSTRAINT fk_t5_t6 foreign key (id1,id2) REFERENCES t5(nid,pid)
)engine=innodb default charset=utf8;
MySQL报错cannot add foreign key constraint解决方法
原因分析:
创建外键错误的原因大概有一下几个原因:
1、关联的两个字段的字段的类型不一致
2、设置外键删除时set null
3、两张表的引擎不一致
3.2、DML语言
数据库的意义:数据存储,数据管理
Data Manipulation Luaguge:数据操作语言
1. 添加 insert
-- 普通用法
INSERT INTO `student`(`name`) VALUES ('zsr');
-- 插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女');
-- 省略字段
INSERT INTO `student` VALUES (5,'Bareth','123456','男','2000-02-04','武汉','1412@qq.com',1);
语法:
INSERT INTO 表名([字段1,字段2..])VALUES('值1','值2'..),[('值1','值2'..)..];
注意:
1、字段和字段之间使用英文逗号隔开
2、字段是可以省略的,但是值必须完整且一一对应
3、可以同时插入多条数据,VALUES后面的值需要使用逗号隔开
2. 修改 update
-- 修改学员名字,指定条件
UPDATE `student` SET `name`='zsr204' WHERE id=1;
-- 不指定条件的情况,会改动所有表
UPDATE `student` SET `name`='zsr204';
-- 修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1;
-- 通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';
语法:
UPDATE 表名 SET 字段1=值1,[字段2=值2...] WHERE 条件[];
关于WHERE条件语句:
| 操作符 | 含义 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| = | 等于 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 或!= | 不等于 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > | 大于 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
=95 AND `StudentResult`=95 && `StudentResult`90;
4.4、连接查询
自连接 自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
得到下表:
操作:查询父类对应的子类关系
4.5、排序和分页排序语法:
order by 的位置一般放在查询语句的最后(除limit语句之外)
分页语法:
offset 代表的是起始的条目索引,默认从0开始
4.6、子查询本质:在 where子句中嵌套一个子查询语句
4.7、MySQL函数1. 常用函数
2. 聚合函数
select count(*)和select count(1)的区别 1、 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 2、 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 3、 如果有主键的話,那主键作为count的条件时候count(主键)最快 4、 如果你的表只有一个字段的话那count(*)就是最快的 5、count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计 5、数据库级别的MD5加密MD5信息摘要算法(MD5 Message-Digest Algorithm) MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性 MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值
6、事务要么都成功,要么都失败。 将一组SQL放在一个批次中去执行 例如银行转账: 只有A转账成功且B成功到账,该事件才算结束,如果一方不成功,则该事务不成功 6.1、事务原则:ACID
原子性针对同一个事务 A: 800 - 200 = 600 原子性表示,这两个步骤一起成功,或者一起失败,不能只发生其中一个动作。 一致性(Consistency)针对一个事务操作前与操作后的状态一致 一致性表示事务完成后,符合逻辑运算 持久性(Durability)表示事务结束后的数据不随着外界原因导致数据丢失 操作前A:800,B:200 如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为 A:800,B:200 如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为 A:600,B:400 隔离性(Isolation)针对多个用户同时操作,主要是排除其他事务对本次事务的影响 两个事务同时进行,其中一个事务读取到另外一个事务还没有提交的数据,执行步骤如图所示,按照数字顺序执行 6.2、事务并发导致的问题
6.3、隔离级别在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别 读未提交: 一个事务读取到其他事务未提交的数据;这种隔离级别下,查询不会加锁,一致性最差,会产生脏读、不可重复读、幻读的问题 读已提交: 一个事务只能读取到其他事务已经提交的数据;该隔离级别避免了脏读问题的产生,但是不可重复读和幻读的问题仍然存在; 读提交事务隔离级别是大多数流行数据库的默认事务隔离级别,比如 Oracle,但是不是 MySQL 的默认隔离界别 可重复读: 事务在执行过程中可以读取到其他事务已提交的新插入的数据,但是不能读取其他事务对数据的修改,也就是说多次读取同一记录的结果相同;该个里级别避免了脏读、不可重复度的问题,但是仍然无法避免幻读的问题 可重复读是MySQL默认的隔离级别 串行化: 事务串行化执行,事务只能一个接着一个地执行,、,并且在执行过程中完全看不到其他事务对数据所做的更新;缺点是并发能力差,最严格的事务隔离,完全符合ACID原则,但是对性能影响比较大
四种隔离级别设置 数据库 set transaction isolation level 设置事务隔离级别 select @@tx_isolation 查询当前事务隔离级别
6.4、事务演示进入MySQL
数据测试准备
案列1:脏读演示,读到其他事务未提交的数据操作步骤 1、事务一(右):A向B转200,不提交事务 改变事务二(左)事务级别为READ-UNCOMMITTED
其他事务级别请自行测试(与理论预期一致)
这里说明一下,SERIALIZABLE事务是串行执行,演示的时候只能由其中一个客户端操作,直到提交事务,另外一个客户端才能操作。 6.5、执行事务的过程1️⃣ 关闭自动提交
2️⃣ 事务开启
3️⃣ 成功则提交,失败则回滚
4️⃣ 事务结束
5️⃣ 其他操作
7、索引索引(Index)是帮助MySQL高效获取数据的数据结构。 1、提高查询速度
7.1、索引的分类
主键索引(PRIMARY KEY)唯一的标识,主键不可重复,只有一个列作为主键 最常见的索引类型,不允许为空值
普通索引(KEY / INDEX)默认的,快速定位特定数据 index 和 key 关键字都可以设置常规索引
唯一索引(UNIQUE KEY)它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值 与主键索引的区别:主键索引只能有一个、唯一索引可以有多个
全文索引(FULLText)快速定位特定数据(百度搜索就是全文索引) 在特定的数据库引擎下才有:MyISAM
7.2、索引的使用1. 索引的创建在创建表的时候给字段增加索引
创建完毕后,增加索引
2. 索引的删除
3. 显示索引信息
4. explain分析sql执行的情况
7.3、测试索引建表 app_user:
批量插入数据:100w
在执行函数 在执行 删除已存在的函数 测试查询速度
7.4、索引原则索引不是越多越好,小数据量的表不需要加索引 不要对经常变动的数据增加索引 索引一般加在经常要查询的列上 8、explain关键字1、表的读取顺序 使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。 explain执行计划包含的信息
explain用法 explain 执行计划包含的信息
idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: 1、id相同:执行顺序由上至下
select_type查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询 1、SIMPLE:简单的select查询,查询中不包含子查询或者union 4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里 5、UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived 6、UNION RESULT:从union表获取结果的select type访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
1、system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,可以忽略不计 2、const:表示通过索引一次就找到了,const用于比较primary key 或者 unique索引。因为只需匹配一行数据,所有很快。如果将主键置于where列表中,mysql就能将该查询转换为一个const
4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体
possible_keys查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用 key实际使用的索引,如果为NULL,则没有使用索引。 查询中如果使用了覆盖索引,则该索引仅出现在key列表中
key_len表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的 ref显示索引的那一列被使用了,如果可能,是一个常量const。 rows根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 Extra不适合在其他字段中显示,但是十分重要的额外信息 1、Using filesort :
2、Using temporary:
如果同时出现Using where,表明索引被用来执行索引键值的查找(参考上图) 如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作
也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。 注意: a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select * 4、Using where : 5、Using join buffer : 6、Impossible WHERE:
在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即可完成优化 8、distinct: 优化distinct操作,在找到第一个匹配的元祖后即停止找同样值得动作 9、权限管理和备份9.1、用户管理方式一:可视化管理
9.2、数据库备份保证重要的数据不丢失、数据转义 方式一:直接拷贝物理文件,MySQL数据表以文件方式存放在磁盘中 包括表文件 , 数据文件 , 以及数据库的选项文件 位置 : Mysql安装目录\data\(目录名对应数据库名 , 该目录下文件名对应数据表)
方式二:可视化管理 Navicat打开要备份的数据库,然后点击新建备份 方式三:可视化管理 方式四:命令mysqldump导出
source命令导入 10、三大范式规范化理论: 改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余的问题。
在关系型数据库中这种规则就称为范式 在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由,比如性能,事实上,我们经常会为了性能而妥协数据库的设计。 三大范式的通俗理解目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 而通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是本文要讲的“三大范式”。 第一范式:每个列不可再拆分 第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项举例说明:
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。 举例说明: 但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关, 这样就不满足第二范式的要求,调整如下,需分成两个表: 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。 举例说明: 而不是主键“学号”,所以需做如下调整:
ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合实际情况,不过只要能理解就行。 11、MyISAM和InnoDB区别
聚集索引、复合索引、前缀索引、唯一索引默认都是使用B+tree树(多路搜索树,不一定是二叉的)索引,统称索引
关注
打赏
热门博文
立即登录/注册
微信扫码登录 |
