重学数据库MySQL

Posted 牛牛最爱喝兽奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重学数据库MySQL相关的知识,希望对你有一定的参考价值。

重学mysql


第一次草率的学的学完了MySql之后,学会了基本的增删改查,但是其中的事务、索引、视图、存储引擎和SQL优化还是不是特别明白,今天再一次学习数据库。

#insert 插入操作
INSERT INTO 表名(列名1,列名2,...) VALUES (数据1,数据2...);

#update 更新操作
UPDATE 表名 SET 列名1=1,列名2=2,...WHERE 条件表达式;

#delete 删除操作
DELETE FROM 表名 WHERE 条件表达式

#select 查询操作
SELECT 列名1,列名2... FROM 表名 [条件表达式]

交叉连接: 多个表交叉连接时,在 FROM 后连续使用 CROSS JOIN 或,即可。以上两种语法的返回结果是相同的,但是第一种语法才是官方建议的标准写法。笛卡尔积

内连接: 内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。

外连接: 外连接可以分为左外连接和右外连接,下面根据实例分别介绍左外连接和右外连接。

SELECT <字段名> FROM <1> LEFT OUTER JOIN <2> <ON子句>

left outer join --on 只可以省略outer,表示左连接,“表1”为基表,“表2”为参考表。左连接查询时,可以查询出“表1”中的所有记录和“表2”中匹配连接条件的记录。如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。

SELECT <字段名> FROM <1> RIGHT OUTER JOIN <2> <ON子句>

与左连接相反,右连接以“表2”为基表,“表1”为参考表。右连接查询时,可以查询出“表2”中的所有记录和“表1”中匹配连接条件的记录。如果“表2”的某行在“表1”中没有匹配行,那么在返回结果中,“表1”的字段值均为空值(NULL)。

试图:
MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。
区别:

1.视图不是数据库中真实的表,而是一张虚拟表,其结构和数据是建立在对数据中真实表的查询基础上的。
2.存储在数据库中的查询操作 SQL 语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据。
3.视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的。
4.视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示数据,其数据来源还是实际表。
5.视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些 SQL 语句的集合。从安全的角度来看,视图的数据安全性更高,使用视图的用户不接触数据表,不知道表结构。
6.视图的建立和删除只影响视图本身,不影响对应的基本表。

优点:

  1. 定制用户数据,聚焦特定的数据
    在实际的应用过程中,不同的用户可能对不同的数据有不同的要求。
    例如,当数据库同时存在时,如学生基本信息表、课程表和教师信息表等多种表同时存在时,可以根据需求让不同的用户使用各自的数据。学生查看修改自己基本信息的视图,安排课程人员查看修改课程表和教师信息的视图,教师查看学生信息和课程信息表的视图。
  2. 简化数据操作
    在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作。
  3. 提高数据的安全性
    视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全。
  4. 共享所需数据
    通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次。
  5. 更改数据格式
    通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。
  6. 重用 SQL 语句
    视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。

创建视图:

CREATE VIEW <视图名> AS <SELECT语句> //根据需求,通过select创建自己想要的数据表

索引:单列索引、复合索引、唯一索引、主键索引等
索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

  1. 顺序访问
    顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
    顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。
  2. 索引访问
    索引访问是通过遍历索引来直接访问表中记录行的方式。
    使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
    例如,在学生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系统就建立了一张索引列到实际记录的映射表。当用户需要查找 student_id 为 12022 的数据的时候,系统先在 student_id 索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。

简而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。
优点
索引的优点如下:
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
可以给所有的 MySQL 列类型设置索引。
可以大大加快数据的查询速度,这是使用索引最主要的原因。
在实现数据的参考完整性方面可以加速表与表之间的连接。
在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点
增加索引也有许多不利的方面,主要如下:
创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

创建索引:

CREATE <索引名> ON <表名> (<列名> [<长度>] [ ASC | DESC])
SHOW INDEX FROM <表名> [ FROM <数据库名>]//查看索引
//创建唯一索引,通常使用 UNIQUE 参数。

索引的底层结构:

事务ACID+仅InnoDB:

原子性(Autmic):一个原子事务要么完整执行,要么干脆不执行。也就是说,工作单元中的每项任务都必须正确执行,如果有任一任务执行失败,则整个事务就会被终止并且此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,那么对数据所作的修改将会是永久性的
一致性(Consistency):一致性代表了底层数据存储的完整性。
它是由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求;
应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(数据预期所表达的现实业务情况不相一致)。例如,在刚才的AB转账过程中,从A账户中扣除的金额必须与B账户中存入的金额相等。
隔离性(Isolation):隔离性是指事务必须在不干扰其他事务的前提下独立执行,也就是说,在事务执行完毕之前,其所访问的数据不能受系统其他部分的影响。
持久性(Durability):持久性指明当系统或介质发生故障时,确保已提交事务的更新数据不能丢失,也就意味着一旦事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障,持久性可以通过数据库备份和恢复来保证。

通常情况

-- 声明事务的开始
BEGIN(START TRANSACTION);

-- 提交整个事务
COMMIT;

-- 回滚到事务初始状态
ROLLBACK;

设置保存点:

-- 定义保存点(回滚点)
SAVEPOINT savepoint_name(名称);

--回滚到指定保存点
ROLLBACK TO SAVEPOINT savepoint_name(名称);

-- 关闭自动提交功能
SET AUTOCOMMIT=0;
-- 开启自动提交功能
SET AUTOCOMMIT=1;

commit有点需要知道的,在mysql中每条sql命令都会被自动commit,这种功能称为自动提交功能,是默认开启的。前面我们在执行事务使用了begin命令开启了事务,这时自动提交在事务中就关闭了直到事务被手动commit。
在数据里也涉及到了锁的概念,因为在事务机制下锁可以防止脏读,数据库里面主要有两种锁一种共享锁另一种排他锁也叫互斥锁。共享锁意味着锁是可以共享的,共享的肯定就是大家都可以去拿到,默认读的时候会采用共享锁,互斥锁当前仅有一个线程可以拥有它,主要是修改、删除、插入时会使用,不然会造成脏读。
共享锁定: 将对象数据变为只读形式的锁定,这样就允许多方同时读取一个数据,此时数据将无法修改。
排他锁定: 在对数据进行insert/update/delete时进行锁定,在此时其他用户(进程或事务)一律不能读取数据,从而也保证数据完整性。
根据锁的粒度不同,还可以分为行级锁、表级锁、数据库锁,共享锁和排他锁是行级锁。

请注意InnoDB行锁是通过给索引上的索引项加锁来实现的,也就是说,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

以上是关于重学数据库MySQL的主要内容,如果未能解决你的问题,请参考以下文章

重学数据库MySQL

重学数据库MySQL

重学MySQL笔记

重学MySQL笔记

一次 Keepalived 高可用的事故,让我重学了一遍它!

linux中怎么查看mysql数据库版本