[数据库][mysql] 知识拾遗

这里记录一些没有整理的数据库和mysql相关知识。

1.Mysql常见存储引擎

1)InnoDB存储引擎

  为表提供事务处理、回滚、崩溃修复和多版本并发控制功能(或机制)。支持自动增长键值(AUTO_INCREMENT)、以及外键。

InnoDB创建的表存储在frm文件中。优点是良好的事务处理、崩溃修复、并发控制。缺点是读写效率差,占用的空间大。

2)MyISAM存储引擎

  将表保存为三个文件:frm(存储表结构)、MYD(Data,存储数据)、MYI(Index,存储索引)。保存的数据支持静态型、动态型(可变长)、压缩型。

3)MEMORY存储引擎

  数据文件保存在内存中,而仅在磁盘上保存表的结构(frm文件)。默认使用hash索引,因此能比B树和B+树更快。

2.Mysql操作类型

1)DDL操作

  即操作数据库或者操操作数据库表。

  a.操作数据库: create 和 drop;

  b.操作数据库表:

  添加字段

    alter table tablename add 字段名 类型(长度)[first //添加到第一列][after 字段名 //添加到指定字段后];

  删除字段

    alter table tablename drop 字段名;

  修改字段(名称、类型、长度、约束、描述等)

    alter table tablename modify 字段名 新类型 新约束;

    alter tabe tablename change 旧字段名 新字段名 新类型 新约束;

  修改表名

    rename table tablename to newname;

  删除数据库

    drop table tablename;

2)DML操作

  即操作数据库表内记录值的操作。

  1)插入 insert into tablename[(t1, t2, ...)] values(val1, val2, ...); 可以批量插入,并且批量插入时可以减少IO操作,提高效率。

  2)删除 delete from tablename [where condition];

  3)  修改 update tablename set 字段名 = 值, ..., [where condition];

3)DQL操作

  即查询数据表的操作。

  select 字段(或者*) from tablename [where condition] ;

  查询辅助字段:

  inner join ...(内联目标) on ...() 内联外键,效果是将两张表(通过外键关联)拼接并进行查询。其他的连接还有左连接和右连接。

  like 模糊查询,即进行字段正则匹配。

  group by 分组后分开处理(一般用于返回聚合函数统计值,如SUM、COUNT、AVG、MAX、MIN)。

  having 筛选满足特定字段条件的记录(行)。

  order by 字段 desc; 按照某一字段降序排序。

  limit 索引,页容量; 限制返回的结果数量。配合order可以查询最后数条记录。

3)DCL操作

  即管理数据库系统中的对象权限。包括创建/修改用户、控制权限转移等。

  常见的是grant(给予用户权限) 、 revoke(撤销用户权限)和show(查看用户、权限、密码套件等) 命令。

  例:

  查看权限

  show grants for ‘username’@’host’;

  添加所有数据库所有表的所有权限(并允许传递):

  gtant all privileges on *.* to ‘username’@’host’ with grant option;

  删除权限:

  revoke all privileges on *.* from 'username'@'host';

  添加完后刷新属性:

  Flush privileges;

3. 事务

  Mysql事务是将一组sql语句放在同一个批次内执行。如果某一个sql语句错误,则取消该批次所有语句的执行。

1)ACID性质

  A:原子性,事务中的sql语句被当做整体执行,执行时要么全部成功,要么全部失败。

  C:一致性,确保事务执行后要么成功(数据变成提交后的状态),要么失败(回到提交前的状态),不会因为事务的执行产生其他状态。

  I:隔离性,即事务处理时,事务间相互不影响,彼此独立透明。

  D:持久性,事务一旦提交成功,对数据的影响是永久的。

2)确保ACID的机制

  A:通过undo log记录回滚操作需要的信息(未提交事务的操作记录),当执行失败或调用rollback后,会利用undo log进行数据回滚。

  C:数据库层面保证(即undo log和redo log的回滚机制)以及两阶段事务提交确保持久化时的一致性(第一阶段:写入redo log,第二阶段:写入binglog,更改redo log状态为commit)。

  I:写操作使用锁机制进行隔离,读写操作依靠MVCC机制实现。

  D:事务提交后,数据会被保存到磁盘上。不过若频繁进行读写操作可能导致IO拥塞,因此数据会先被写入buffer pool,然后被定期地更新到磁盘中(刷脏操作)。为了避免刷脏前宕机导致数据丢失,每次提交时必须先写入redo log,成功后方才认为事务提交成功。当mysql重启时,可以读取redo log进行恢复。

2)事务使用

  开启事务:start transaction;  

  设置自动提交,这会使得事务语句完成后自动提交:SET autocommit=1;

  回滚 rollback;

3)事务隔离级别

  被放在另外一篇博客:https://www.cnblogs.com/cheungilin/articles/15368795.html

4.视图

  视图可以被看作一次select查询的留存。使用视图通常是为了向用户隐藏数据库的某些结构(数据独立)、使得表符合业务逻辑(简单易用)、避免用户操作某些字段(安全)。

  视图中可以有多张表,或者嵌套多个视图。但当数据来自多张表时,不允许添加和删除数据。

  视图中的数据是原表数据的“引用”,即会影响原表。

  显然,在视图上只能进行DML操作。

1)视图读

  看过innoDB MVCC机制的同学可能还记得其中涉及“视图读”的概念。即在RR和RC事务隔离级别时,使用select查询数据时,会自动生成一个ReadView,记录当前活跃的事务id,用以确认是否能够读取某个版本的记录。

2)视图操作

  创建视图:create view 视图名 as 查询语句;

  查看视图:select 字段1,... from 视图名;

5.数据库设计-三大范式

1)第一范式: 确保每个字段的原子性。

2)第二范式:一张表仅描述一个实体,即确保表中每个字段均和主键相关。满足第一范式,除主键外其他键依赖于主键。

3)第三范式:确保每一列的值都和逐渐字节相关。满足第二范式,除了主键外的列均只能依赖主键,列之间不相互依赖。

6.mysql数据类型

 1)数值

TINYINT(1Byte)、SMALLINT(2Byte)、MEDIUMINT(3Byte)、INT(4Byte)、BIGINT(8Byte)、FLOAT(4Byte) 、DOUBLE(8Byte)、DECIMAL(依赖M和D值)。

2)日期和时间

DATE、TIME、YEAR、DATETIME、TIMESTAMP

3)字符串

CHAR(255Bytes)、VCHAR(可变长,65535Bytes)、TINYTEXT(255Bytes)、TEXT(65535Bytes)、MEDIUMTEXT(16MB)、LONGTEXT(4GB)。

4)二进制文本

TINYBLOB(255Bytes)、BLOB(65535Bytes)、MEDIUMBLOBS(16MB)、LONGBLOB(4GB)。

6.left join、right join、inner join

左连接:返回左表中所有记录以及由表中连结字段相等的记录。

右连接:返回右表中所有记录以及由表中连结字段相等的记录。

等值连接:只返回连接字段相等的记录。

posted @ 2022-03-28 15:05  Cheung-10  阅读(32)  评论(0)    收藏  举报