目录
一. 数据库四大引擎
1.1 引擎查看
查看命令
- SHOW ENGINES
Support字段说明
- default为默认引擎
- YES表示可以使用
- NO表示不能使用
1.2 InnoDB引擎
使用场景
- 事务性的一般使用该引擎,用途最广,如果不知道使用哪种引擎,就使用该引擎
特点
- 修改快,支持事务(只有它支持事务)——行锁
- 存储限制:64TG
1.3 MyISAM引擎
使用场景
- 在开发中,数据字典、系统参数表会用到。
- 大量查询,很少修改的时候
特点
- 强调了快速读取操作——表锁
- 存储限制:256TG
- 不支持事务
1.4 MEMORY引擎
使用场景
- 由于易失性,用于存储在分析中产生的中间表
特点
- 所有的数据都存储在内存中,一旦服务器重启,所有的表数据都会丢失但表结构会保存
- 存储限制:取决于RAM(随机存储器)
- 不支持事务
1.5 Archive引擎
使用场景
- 在日志和数据采集时使用
特点
- 只允许插入和查询,不允许修改和删除,压缩存储,节约空间,可以实现高并发的插入,支持在自增ID上建立索引
二. 数据库管理
2.1 元数据库
简介
- 记录MySQL自身数据的数据库
元数据库分类
1、information_schema
信息数据库,保存MySQL所维护的其他数据库信息。
例如:数据库名、数据库表、表栏的数据类型与访问权限等。
2、mysql
核心数据库,主要负责存储数据库的用户,权限设置,关键字等。
mysql自己需要使用的控制和管理信息。
3、performance_schema
用于mysql的监控数据的存放。
2.2 数据库的增删改查及使用
- 使用:use 数据库名
- 增加:create database if not exists 数据库名 default charset utf8 collate utf8_general_ci;(设置字符集编码以及不区分大小写)
- 查询所有数据库:show database
- 删除:drop database 数据库名;
2.3 权限相关表
1、user表(用户层权限)
决定用户拥有哪些数据库的权限
2、db表(数据库层权限)
决定用户对于该数据库哪些表具有操作权限
3、tables_priv表(表层权限)
决定了用户对于具体某张表具有增删改查的权限
4、columns_priv表(字段层权限)
决定了用户对于某张表的哪些字段具有操作权限
三. 数据表管理
3.1 三大范式
- 第一范式:列不可再分(原子性)
假如说,将一个地址湖南省长沙市岳麓区浪琴湾15栋。这个时候需要用四个字段来保存这个地址:province保存省份、city保存市、area保存区域、address保存详细地址。这样就符合了第一范式。
- 第二范式:主键约束
也就是说一张表的每一个字段它都要依托于主键存在。例如:订单项表里有编号、单价、数量、小计。这里的小计是依托于单价和数量存在,这就违背了第二范式。
- 第三范式:外键约束
假如说在医疗系统中,需要拿到一个患者的档案信息,那么就需要用到两张表,患者信息表和医生信息表。要在患者信息表中保存医生id,而不能直接在患者表中拿到医生姓名。
3.2 基本数据类型
优化原则
1、越小越好
- 越小越快;
- 拥有更小的磁盘空间、内存、CPU缓存;
- 更少的CPU周期。
2、简单就好
- 整型比字符串操作代价更小;
- 用时间类型表示日期,而不是字符串。
3、尽量避免使用NULL
- 尽量指定列为NOT NULL,特别是需要建索引的列;
- 查询含有NULL的类,MySQL更难优化(不利于使用索引、索引统计更复杂、值比较 更复杂);
- 用整型值而非字符串表示IP地址。
分类
1、整数
- tinyint 8位(-128~127)
- smallint 16位(-32768~32767)
- mediumint 24位(-8388608~8388607)
- int 32位 (大约正负21亿)
- bigint 64位
2、实数(带有小数点)
- float 4个字节
- double 8个字节
- decimal 最多允许65个数字(涉及到数字的运算最好使用decimal)
3、字符串
- char:定长,MySQL根据定义字符串的长度一次分配足够的空间;
适用场景:较短的字符串,且所有值接近同一长度。
- varchar:比定长类型节约空间;
适用场景:字符串的最长长度比评估长度大很多,列的更新较少;
缺点:频繁修改,且字符串的长度变化大时,可能出现页分裂。
4、text存储字符数据 & blob存储二进制数据
- tinytext tinyblob
- smalltext smallblob
- mediumtext mediumblob
- text blob
- longtext longblob
都为存放很大的数据而设计;
与其他数据不同,都作为独立的对象存储;
当值太大时,使用外部存储区存储。
5、日期时间
- datetime
精度:秒;
与时区无关,8个字节存储空间;
范围:1001至9999年。
- timestamp
保存1970年1月1日午夜以来的秒数;
占用4个字节存储空间;
范围:1970年至2038年;
与时区有关;
默认为NOT NULL;
通常尽量使用timestamp。
- date:yyyy-MM-dd
- time:HH:mm:ss
6、选择标识符
- 用来进行关联操作;
- 在其他表中作为外键;
- 整型通常是标识符的最好选择;
- 相关的表中使用相同的数据类型;
- 尽量避免字符串作为标识列,尤其是随机生成的字符串(如uuid)
原因:①插入值被随机写到索引的不同位置,insert慢,容易导致页分裂,磁盘随机读取;
②逻辑上相邻的行被分布在磁盘和内存的不同地方,select慢;
③使MySQL查询缓存失效;
④如果需要存储uuid,则应将“-”去除
四. 数据库账号管理
4.1 通用
1、查询用户
select *from user;
2、查看用户常用信息
select host,user from user;
user表中host列的值的意义:
- % 匹配所有主机
- localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
- 127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问
3、删除用户
drop user 用户名;
4、权限操作
- 设置权限(grant):grant privileges on databasename.tablename to username@'host';
- 撤销权限(revoke):revoke privileges on databasename.tablename from username@'host'; revoke只能回收grants列表中更小的权限;
- 查看用户权限:show grants for 用户名;
4.2 不同
4.2.1 MySQL5.7版本
1、创建用户并设置登录密码
create user 用户名 identified by '密码';
(identified by 会将纯文本密码加密作为散列值存储)
2、修改用户密码
set password for 用户名 = password('新密码');
flush privileges;
4.2.2 MySQL8.0版本
1、创建用户并设置登录密码
用户名密码创建需要分开;
create user 用户名;
2、修改用户密码
alert user 用户 identified with mysql_native_password by'123456';
思维导图