美文网首页
数据库汇总

数据库汇总

作者: 就如此简单 | 来源:发表于2020-07-24 10:32 被阅读0次

    一、创建库,删除库,使用库0

    1.创建数据库:create database 库名;

    2.删除数据库:drop database 库名;

    3.使用数据库:use 库名;

    二、创建数据表

    1.创建表语句:create table 表名(字段名1 字段类型 字段约束,字段2 字段类型 字段约束...);

    2.创建与现有表一样字段的新表:create table 表名 like 已有表名;

    3.将查询结果创建新表:create table 表名 select * from 现有表 where...(查询语句);

    三、查看表结构,查看建表语句,删除表

    1.查看表结构:desc 表名;

    2.查看建表语句:show create table 表名;

    3.删除表:drop table 表名;

    四、修改表结构

    1.对数据表重命名:alter table 表名 rename 新表名;

    2.增加字段:alter table 表名 add 字段名 字段类型 字段约束; (PS:可用first/after函数调整字段位置)

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

    4.修改字段类型及约束:alter table 表名 modify 字段名 新类型 新约束;(PS:如不加新约束,会将建表时的约束清空,主键、外键、唯一约束除外)

    5.修改字段名称:alter table 表名 change 字段名 新字段名 新字段类型 新约束条件;

    6.修改数据库引擎:alter table 表名 engine=;(PS:主要有InnoDB和MyISAM,InnoDB对经常修改表数据友好,MyISAM对经常查询表友好)

    7.增加主键:alter table 表名 add primary key(字段名);

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

    9.增加外键:alter table 表名 add constraint 外键名 foreign kek(字段名) references 主表(主键);

    10.删除外键:alter table 表名 drop foreign key 外键名;

    11.删除唯一约束:alter table 表名 drop index 字段名;

    12.设置自动增长的初始位置:alter table 表名 auto_increment=n;

    五、向表中插入数据

    1.向表指定字段插入多条数据:insert into 表名(字段1,字段2...) values(数据1,数据2...),(数据1,数据2...),(数据1,数据2...),(数据1,数据2...);

    2.将查询结果插入表:insert into 表名 select 字段名 from 表名(查询语句);

    3.加载外部数据到表:Load data local infile ‘数据路径’Into table 表名 Fields terminated by ‘分隔符’Ignored 1 lines;

    六、更新表数据、删除表数据

    1.更改满足条件的字段数据:update 表名 set 字段计算1,字段计算2... where 条件;

    2.删除满足条件的数据:delele from 表名 where 条件;

    3.删除所有数据:方式一:delete from 表名; 方式二:truncate table 表名; 方式一会逐条进行删除,速度较慢,方式二直接删除,速度快;另外对自增字段,方式一不能重置自增字段的初始位置,方式二可以重置自增字段的其实位置;

    七、查找数据

    Select 列名 From 数据表名 Where 查询条件 Group by 分组字段 Having 分组后的约束条件 Order by 排序字段 Limit 限制输出行数。

    一、事务

    所谓事务就是针对数据库的一组操作,它可以由一条或者多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中有一条语句不能执行的话,那么所有的语句都不会执行,也就是说,事务中的语句要么都执行,要么都不执行。

    二、事务四大特性

    指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

    (1)原子性: 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

    (2)一致性:一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

    (3)隔离性:隔离性是指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到 。

    (4)持久性:持久性是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。

    二、事务的并发问题

      1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

      2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

      3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    二、索引

    1、索引的底层实现(重点)

    数据库的索引是使用B+树来实现的。

    1.1(为什么要用B+树,为什么不用红黑树和B树)

    B+树是一种特殊的平衡多路树,是B树的优化改进版本,它把所有的数据都存放在叶节点上,中间节点保存的是索引。这样一来相对于B树来说,减少了数据对中间节点的空间占用,使得中间节点可以存放更多的指针,使得树变得更矮,深度更小,从而减少查询的磁盘IO次数,提高查询效率。另一个是由于叶节点之间有指针连接,所以可以进行范围查询,方便区间访问。

    而红黑树是二叉的,它的深度相对B+树来说更大,更大的深度意味着查找次数更多,更频繁的磁盘IO,所以红黑树更适合在内存中进行查找。

    2、B树与B+树的区别

    这都是由于B+树和B具有不同的存储结构所造成的区别,以一个m阶树为例。

    关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,但是B树虽然也有m个子结点,但是其只拥有m-1个关键字。

    存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。

    分支结点的构造不同;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。

    查询不同;B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中走了一条从根结点到叶子结点的路径。

    B+树优点:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引,而B树则常用于文件索引。

    3、MYSQL数据库引擎介绍,innodb和myisam的特点与区别

    InnoDB : InnoDB是mysql的默认引擎,支持事务和外键,支持容灾恢复。适合更新频繁和多并发的表 行级锁

    MyISAM : 插入和查询速度比较高,支持大文件,但是不支持事务,适合在web和数据仓库场景下使用 表级锁

    MEMORY : memory将表中的数据保存在内存里,适合数据比较小而且频繁访问的场景


    5、什么是脏读,不可重复读和幻读?

    详见数据库的事务隔离级别总结

    脏读:脏读是指一个事务在处理过程中读取了另一个还没提交的事务的数据。

    比如A向B转账100,A的账户减少了100,而B的账户还没来得及修改,此时一个并发的事务访问到了B的账户,就是脏读

    不可重复读:不可重复读是对于数据库中的某一个字段,一个事务多次查询却返回了不同的值,这是由于在查询的间隔中,该字段被另一个事务修改并提交了。

    比如A第一次查询自己的账户有1000元,此时另一个事务给A的账户增加了1000元,所以A再次读取他的账户得到了2000的结果,跟第一次读取的不一样。

    不可重复读与脏读的不同之处在于,脏读是读取了另一个事务没有提交的脏数据,不可重复读是读取了已经提交的数据,实际上并不是一个异常现象。

    幻读:事务多次读取同一个范围的时候,查询结果的记录数不一样,这是由于在查询的间隔中,另一个事务新增或删除了数据。

    比如A公司一共有100个人,第一次查询总人数得到100条记录,此时另一个事务新增了一个人,所以下一次查询得到101条记录。

    可重复度和幻读的不同之处在于,幻读是多次读取的结果行数不同,不可重复度是读取结果的值不同。

    避免不可重复读需要锁行,避免幻读则需要锁表。

    脏读,不可重复读和幻读都是数据库的读一致性问题,是在并行的过程中出现的问题,必须采用一定的隔离级别解决。

    详见脏读、不可重复读和幻读的区别

    6、数据库的隔离级别

    为了保证数据库事务一致性,解决脏读,不可重复读和幻读的问题,数据库的隔离级别一共有四种隔离级别:

    读未提交 Read Uncommitted: 最低级别的隔离,不能解决以上问题

    读已提交 Read committed: 可以避免脏读的发生

    可重复读 Reapeatable read: 确保事务可以多次从一个字段中读取相同的值,在该事务执行期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读。 通过锁行来实现

    串行化 Serializaion 最严格的事务隔离机制,要求所有事务被串行执行,可以避免以上所有问题。 通过锁表来实现

    Oracle的默认隔离级别是读已提交,实现了四种隔离级别中的读已提交和串行化隔离级别

    MySQL的默认隔离级别是可重复读,并且实现了所有四种隔离级别

    7、数据的锁的种类,加锁的方式

    以MYSQL为例,

    按照类型来分有乐观锁和悲观锁

    根据粒度来分有行级锁,页级锁,表级锁(粒度一个比一个大) (仅BDB,Berkeley Database支持页级锁)

    根据作用来分有共享锁(读锁)和排他锁(写锁)

     什么是共享锁和排他锁

    共享锁是读操作的时候创建的锁,一个事务对数据加上共享锁之后,其他事务只能对数据再加共享锁,不能进行写操作直到释放所有共享锁。

    排他锁是写操作时创建的锁,事务对数据加上排他锁之后其他任何事务都不能对数据加任何的锁(即其他事务不能再访问该数据)

    乐观锁与悲观锁解释一下

    一般的数据库都会支持并发操作,在并发操作中为了避免数据冲突,所以需要对数据上锁,乐观锁和悲观锁就是两种不同的上锁方式。

    悲观锁假设数据在并发操作中一定会发生冲突,所以在数据开始读取的时候就把数据锁住。而乐观锁则假设数据一般情况下不会发生冲突,所以在数据提交更新的时候,才会检测数据是否有冲突。

    乐观锁与悲观锁是怎么实现的

    悲观锁有行级锁和页级锁两种形式。行级锁对正在使用的单条数据进行锁定,事务完成后释放该行数据,而页级锁则对整张表进行锁定,事务正在对该表进行访问的时候不允许其他事务并行访问。

    悲观锁要求在整个过程中一直与数据库有一条连接,因为上一个事务完成后才能让下一个事务执行,这个过程是串行的。

    乐观锁有三种常用的实现形式:

    一种是在执行事务时把整个数据都拷贝到应用中,在数据更新提交的时候比较数据库中的数据与新数据,如果两个数据一摸一样则表示没有冲突可以直接提交,如果有冲突就要交给业务逻辑去解决。

    一种是使用版本戳来对数据进行标记,数据每发生一次修改,版本号就增加1。某条数据在提交的时候,如果数据库中的版本号与自己的一致,就说明数据没有发生修改,否则就认为是过期数据需要处理。

    最后一种采用时间戳对数据最后修改的时间进行标记。与上一种类似。

    数据库高并发的解决方案

    在web服务框架中加入缓存。在服务器与数据库层之间加入缓存层,将高频访问的数据存入缓存中,减少数据库的读取负担。

    增加数据库索引。提高查询速度。(不过索引太多会导致速度变慢,并且数据库的写入会导致索引的更新,也会导致速度变慢)

    主从读写分离,让主服务器负责写,从服务器负责读。

    将数据库进行拆分,使得数据库的表尽可能小,提高查询的速度。

    使用分布式架构,分散计算压力。

    相关文章

      网友评论

          本文标题:数据库汇总

          本文链接:https://www.haomeiwen.com/subject/nnfjlktx.html