MySQL 事务、视图、索引

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ruanxingzi123/article/details/84197910

一、视图

1.1 为什么使用视图?

   安全——不希望用户看到整个数据库的结构,所以对不同权限的用户使用不同的视图隐藏必要数据;

 方便——让用户更容易获得、理解数据;

1.2 什么是视图?

 视图是一种查看数据库中一个或多个表中数据的方法,是保存在数据库中的select查询。

 视图是一种虚拟表,它的行和列来自查询中引用的表,在执行时,它直接显示来自表中的数据。

1.3 视图常用来进行下面三种操作

  • 筛选表中的行;
  • 防止未经许可的用户访问敏感数据;
  • 将多个物理数据表,抽象为一个逻辑数据表。

1.4 创建、查看视图

    1)创建视图格式:
         create view view_Name as <select子句>;

    2)删除视图   (如果数据库中已经存在同名视图,先删除)
         drop view if exists view_student;
    3)查看视图 
         select * from view_student;

   4)举例:

--创建视图
create view v_goods as select g.*,c.name as cates_name,b.name as brand_name from goods as g left join goods_cates as c on g.cates_id = c.id left join goods_brand as b on g.brand_id = b.id;

--查看视图
 select * from v_goods;

-- 删除视图
drop view v_goods;

1.5 使用视图的注意事项

  • 每个视图中可以使用多个表
  • 与查询相似,一个视图可以嵌套另一个视图,但最好不要超过三层;
  • 对视图数据进行添加、更新和删除操作直接影响表中的数据;
  • 当数据来自多个表时,不允许添加和删除数据。

1.6、视图的作用

    1)提高了重用性,就像一个函数

    2)对数据库重构,却不影响数据库的运行

    3)提高了安全性能,可以对不同的用户

    4)让数据更加清晰

二、事务(Transaction)

2.1 什么是事务?

SQL中,事务是指将一系列数据操作捆绑成为一个整体进行统一管理。

如果一个事务执行成功,该事务中进行的所有数据均会提交,称为数据库中的永久组成部分;

如果事务执行时遇到错误切必须取消or回滚,则数据将全部恢复到操作前的状态,所有更改会被清除。

在数据库系统上执行并发操作时,事务是作为最小的控制单元来使用的,特别适用于多用户同时操作的数据库系统。

2.2 事务的ACID属性

原子性(Atomicity):一个事物必须被视为一个不可分割的最小单位,这个事物中的所有操作要么全部提交成功,要么全部回滚失败,对于一个事物来说,不可能只执行其中的一部分操作,这就是事物的原子性。

事务中的所有元素必须作为一个整体提交或回滚。

一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中)

一致性确保了,及时在执行第三四语句之间系统崩溃,支票账户中也不会损失200元,因为事物最终没有提交,所以事物中所做的修改也不会被保存到数据库中。

事务完成时,数据必须处于一致状态。在事务进行中,可能会不一致。如转账操作中的金额总量。

隔离性(isolation):通常来说,一个事物所做的修改在最终提交以前,对其他事物是不可见得(在前面的例子中,当执行完第三条语句,最后一条语句还没有执行完成,此时另外一个账户汇总程序开始运行,则其账户的余额并没有被剪掉200块)

对数据进行修改的所有并发事务是彼此隔离的,即事务是独立的。

持久性(durability):一旦事物提交,则其所做的修改会永久保存到数据库中。(此时,及时系统崩溃,修改的数据也不会丢失)

指不管系统是否发生了故障,事务处理的结果都是永久的。就是说一旦事务被提交,事务的效果会被永久地保留在数据库中。

2.3 如何执行事务

MySQL的默认存储引擎InnoDB支持事务,InnoDB主要通过UNDO和REDO日志实现

UNDO日志:复制事务执行前的数据,用于在事务发生异常时回滚数据;

REDO日志:记录在事务执行中,每条对数据进行更新的操作,当事务提交时,内容会一起被刷新到磁盘。

2.4  事务的执行过程

MySQL的默认设置下,每句SQL语句就是一个事务,即执行SQL语句后自动提交。

(1)开始时,开启事务 or 关闭默认的自动提交:

  begin; 
  /*或者*/
  start transaction;

这两个语句显示地标记一个事务的起始点.

(2)提交事务

  commit;

这个语句标志一个事务会成功提交,数据保存到数据库的数据文件中,并释放连接时占用的资源。

(3)回滚事务

    rollback;

取消自事务起始点到该语句的所有数据更新操作,将数据状态回滚到事务开始前,并释放事务控制的资源。

/*银行转账实例*/
use mybank;
set names gbk;
begin;
update bank set currentMoney=currentMoney-500 where customerName='张三';
/*如果在这里发现张三的账户中余额不足500,就需要rollback*/
update bank set currentMoney=currentMoney+500 where customerName='李四';
commit;

2.5 MySQL中事务的隔离级别

MySQL中事务的默认隔离级别是repeatable-read(可重读)级别,意味着会话B中如果未关闭自动提交,在会话A中执行事务未结束时(没有commit或者rollback),会话B只能读取到未提交的数据。

2.6 通过关闭自动提交执行事务

/*关闭自动提交*/
use mybank;
set names gbk;
set autocommit=0;
/*一个事务开始,假设操作没有问题*/
update bank set currentMoney=currentMoney-500
     where customerName='张三';
update bank set currentMoney=currentMoney+500
     where customerName='李四';
commit;
/*一个事务已经结束,这是下一个事务的起点*/

/*假设新的事务中,出现了问题,张三余额不足啦!*/
update bank set currentMoney=currentMoney-500
     where customerName='张三';
rollback;

set autocommit=1;

2.7 编写事务的原则

  • 事务尽可能简短,较大的事务占用的资源很多;
  • 事务中访问的数据量尽量少,这样事务之间对资源的争夺就少;
  • 查询数据不要使用事务;
  • 事务处理的过程中尽量不要出现等待用户输入的操作。

三、索引——大大提高数据库的检索速度

3.1 什么是索引

 索引提供指针以指向存储在表中指定列的数据值,再根据指定的排序次序排列这些指针。

 数据库使用指针的方式与使用书的目录很相似,通过搜索索引找到特定的值,再跟随指针到达包含该值的行。

 索引是创建在数据库表对象上的,由表中的一个字段 or 多个字段生成的键组成。

   这些键存储在数据结构(B-树或哈希表)中,因此根据索引的存储类型,B树索引和哈希索引。

 InnoDB和MyISAM存储引擎支持B-树索引。

3.2 索引分类

(1)普通索引

  允许在定义索引的列中插入重复值和空值,唯一任务是加快对数据的访问速度。

  因此,应该只为那些最常出现在查询条件或排序条件中的数据列创建索引。

(2)唯一索引

  唯一索引不允许两行具有相同的索引值。

  若数据中存在重复的键值,一般情况下,所属数据库是不允许创建唯一索引;

  若已经创建了唯一索引,当新数据使得表中的键值重复时,数据库也拒绝接受此数据。

  创建了唯一索引的列允许有空值。

(3)主键索引

  在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。

  主键索引要求主键中的每个值是非空、唯一的,当在查询中使用主键索引时,它还允许快速访问数据。

(4)复合索引

  创建索引时,可以将多个列组合作为索引。

  需要注意的是,只有在查询中使用了组合索引最左边的字段时,索引才会被使用。

(5)全文索引

 全文索引的作用是在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。

 全文索引可以在char、varchar或text类型的列上创建,主要用于在大量文本文字中搜索字符串,此时使用全文索引的效率将大大高于使用SQL的like关键字的效率。

(6)空间索引

  对空间数据类型的列建立的索引,如geometry、point等。

  创建空间索引的列,必须为not null,且只能在存储引擎为MyISAM的表中创建。

3.3 创建、删除索引

  在已存在的表上添加索引的基本语法:

/*创建索引*/
/*length为索引长度,只有字符串类型才能指定索引长度*/
create [unique|fulltext|spatial|] index index_name
    on tableName(colum_Name[length]...);

/*删除索引*/
drop index tableName.index_name;

  删除表,该表的所有索引将同时被删除;

  删除表中的列,如果要删除的列为索引的组成部分,则该列也会从索引中删除;

  如果组成索引的列都被删除,则整个索引都将被删除。

  3.4  选择建立索引的列

  • 频繁搜索的列;
  • 经常用作查询的列;
  • 经常排序、分组的列;
  • 经常用作连接的列(主键/外键)

  不要使用下面的列创建索引:

  • 仅包含几个不同值的列;
  • 表中仅包含几行,因为为小型表创建索引并不实用;

 3.5 一点经验

  查询时减少使用*返回全部列,不要返回不需要的列;

  索引应该尽量小,在字节数小的列上建立索引;

  where子句中有多个条件表达式时,包含索引的表达式应置于其他表达式之前;

  避免在order by子句中使用表达式;

  根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理。

  3.6 查看索引

/*查看已创建的索引*/
show index from tableName;

/*查看学生表中的索引*/
show index from `student`\G;

  在查询语句后面加“\G”,表示结果将按列排列。当表中列较多,需要看表中各列中的值时非常有用。

  在存储类型为InnoDB的表中,经常使用唯一索引、普通索引、组合索引来提高查询效率。

练习:

  #开始运行时间监测
    set profiling =1
    #查找一万条数据ha-99999
    select * from test_index where ttle="ha-99999"
    #查看执行时间
    show profiles;
    # 为title_indexd的title列创建索引
    create index title_index on test_index(title(10))
    #执行查询语句
     select * from test_index where ttle="ha-99999"
     #查看执行时间
    show profiles;

3.7注意:

要注意:建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件,对于一个经常要更新和插入的表格,就没有必要为一个很少使用where字句单独建立索引,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。

建立索引会占用磁盘空间。

四、备份与恢复数据

4.1备份数据:

  #备份数据 mysqldump -uroot -p123456 数据库名 > jd.sql 

  mysqldump -uroot -p123456 jing_dong > jd.sql 

4.2恢复数据

  1)连接mysql,创建新的数据库

   2)退出数据库,执行如下命令:

  #恢复数据 mysql  -uroot -p123456 新数据库名 < jd.sql 

  mysql -uroot -p123456 jing_dong2 < jd.sql 

五、MYSQL主从

1 主从同步的定义

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

使用主从同步的好处:

1.通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。

2.提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据。

3.在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。

2 主从同步的机制

 Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGEMASTERTO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)

3 配置主从同步的基本步骤

有很多种配置主从同步的方法,可以总结为如下的步骤:

(1)在主服务器上,必须开启二进制日志机制和配置一个独立的ID

(2)在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号

(3)在开始复制进程前,在主服务器上记录二进制文件的位置信息

(4)如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)

(5)配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

4 详细配置主从同步的方法

4.1数据备份

如果在设置主从同步前,主服务器上已有大量数据,可以使用 mysqldump 进行数据备份并还原到从服务器以实现数据的复制。执行命令:

$ mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql

 --all-databases :导出所有数据库

 --lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改

 ~/master_db.sql :导出的备份数据(sql 文件)位置,可自己指定

数据还原命令:

$ mysql –uroot –pmysql < master_db.sql

4.2配置主服务器master(从服务器也要设置,但是注意server-id不能相同,主服务器配置为1,从服务器配置其他数值

编辑设置mysqld的配置文件,设置log_bin和server-id

server-id不能相同,主服务器配置为1,从服务器配置其他数值

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 启用log_bin和server-id两项配置

这里写图片描述

重启服务:

$ sudo service mysql restart

登入主服务器Ubuntu中的mysql,创建用于从服务器同步数据使用的帐号

$ mysql –uroot –pmysql

mysql> grant replication slave on *.* to 'slave'@'%' identified by 'slave';

mysql> show master status;

mysql> flush privileges;

mysql> show master status;


+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      107 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

File为使用的日志文件名字,Position为使用的文件位置,这两个参数必须记下,配置从服务器时会用到。

4.3配置从服务器器slave

编辑设置mysqld的配置文件,server-id

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 修改server-id不能与mysql主服务相同,2开始的数值



$ mysql –uroot –pmysql

mysql> change master to master_host='104.199.171.116',master_user='slave',master_password='slave',master_log_file='mysql-bin.000001',master_log_pos=107;
注:master_host:主服务器 Ubuntu 的 ip 地址

master_log_file: 前面查询到的主服务器日志文件名

master_log_pos: 前面查询到的主服务器日志文件位置

开启同步,查看同步状态

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

mysql> start slave;

mysql> show slave status \G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 104.199.171.116

                  Master_User: slave

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 107

               Relay_Log_File: yangwanyan-relay-bin.000002

                Relay_Log_Pos: 253

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 107

              Relay_Log_Space: 414

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

1 row in set (0.00 sec)

新建数据库表和用户

1

2

mysql>  create database ttsx charset='utf8';

mysql> grant all on ttsx.* to 'ttsx'@'%' identified by '123456';

猜你喜欢

转载自blog.csdn.net/ruanxingzi123/article/details/84197910