MySQL 8 事务管理、数据库维护、改善性能

1. 事务处理

并非所有引擎都支持事务处理。MyISAM和InnoDB是两种最常使用的引擎,前者不支持明确的事务处理管理,而后者支持。

事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。

事务transaction:指一组SQL语句;

回退rollback:指撤销指定SQL语句的过程;

提交commit:指将未存储的SQL语句结果写入数据库表;

保留点savepoint:指事务处理中设置的临时占位符,可以对它分步回退(与回退整个事务处理不同)。

控制事务处理:

MySQL使用下面的语句来标识事务的开始:

  START TRANSACTION

使用ROLLBACK:

MySQL的ROLLBACK命令用来回退(撤销)MySQL语句。

  SELECT * FROM ordertotals;

  START TRANSACTION;

  DELETE FROM ordertotals;

  SELECT * FROM ordertotals;

  ROLLBACK;

  SELECT * FROM ordertotals;

这里是先显示了一个表(与事务无关)。用START TRANSACTION来开始事务。用ROLLBACK来回退事务,中间的SQL语句是这个事务的一组SQL命令。

ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)。

哪些事务可以回退?事务处理用来管理INSERT、UPDATE和DELETE语句,不能回退SELECT语句,也不能回退CREATE或DROP操作。

使用COMMIT:

一般的MySQL语句都是直接针对数据库表执行和编写的。这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的。

在事务处理块中,提交不会隐含地进行。为进行明确的提交,使用COMMIT语句:

  START TRANSACTION;

  DELETE FROM orderitems WHERE order_num = 20010;

  DELETE FROM orders WHERE order_num = 20010;

  COMMIT;

在这个例子中,两条DELETE语句不想一般的SQL语句一样直接提交,而是在COMMIT之后才依次提交。如果提交的事务中存在SQL语句出错,则整个事务都不会提交(自动撤销)。

隐含事务关闭:当COMMIT或ROLLBACK语句执行后,事务会自动关闭(将来的更改会隐含提交)。

使用保留点:

简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。

为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样需要回退,可以回退到某个占位符。

这些占位符称为保留点。为了创建占位符,可如下使用SAVEPOINT语句:

  SAVEPOINT delete1;

每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道要回退到何处。

  ROLLBACK TO delete1;  //回退到保留点delete1

释放保留点:

  保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。也可以使用RELEASE SAVEPOINT明确地释放保留点。

更改默认的提交行为:

默认的MySQL行为是自动提交所有更改。即除了事务处理外,任何时候执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。

为指示MySQL不自动提交更改,需要使用以下语句:

  SET autocommit=0;

autocommit标志决定是否自动提交更改,不管有没有COMMIT语句。设置autocommit为0(假)指示MySQL不自动提交更改(直到autocommit被设置为真为止)。

autocommit标志是针对每个连接而不是服务器的。

2. 数据库维护

备份数据:

像所有数据一样,MySQL的数据也必须经常备份。由于MySQL数据库是基于磁盘的文件,普通的备份系统和例程就能备份MySQL的数据。但是,由于这些文件总是处于打开和使用状态,普通的文件副本备份不一定总是有效。

备份数据库可选方式:

  (1)使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件。在进行常规备份前这个实用程序应该正常运行,以便能正确地备份转储文件。

  (2)可用命令行实用程序mysqlcopy从一个数据库复制所有数据(并非所有数据库引擎都支持这个实用程序)。

  (3)可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件。这两条语句都接受将要创建的系统文件名,此系统文件必须不存在,否则会出错。数据可以用RESTORE TABLE来复原。

为了保证所有数据被写到磁盘(包括索引数据),可能需要在进行备份前使用FLUSH TABLES语句。

进行数据库维护:

MySQL提供了一系列语句,可以(应该)用来保证数据库正确和正常运行。

(1)ANALYZE TABLE,用来检查表键是否正确。ANALYZE TABLE返回如下所示的状态信息:

  ANALYZE TABLE orders;

(2)CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对索引进行检查。CHACK TABLE支持一系列的用于MyISAM表的方式。CHANGED检查自最后一次检查以来改动过的表。EXTENDED执行最彻底的检查,FAST只检查未正常关闭的表,MEDIUM检查所有被删除的链接并进行键检验,QUICK只进行快速扫描。以下用CHECK TABLE发现和修复问题:

  CHECK TABLE orders, orderitems;

(3)如果MyISAM表访问产生不正确和不一致的结果,可能需要用REPAIR TABLE来修复相应的表。这条语句不应该经常使用,如果需要经常使用,可能会有更大的问题要解决。

(4)如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的空间,从而优化表的性能。

诊断启动问题:

服务器启动问题通常在对MySQL配置或服务器本身进行更改时出现。MySQL在这个问题发生时报告错误,但由于多数MySQL服务器是作为系统进程或服务自动启动的,这些消息可能看不到。

mysqld命令行选项:

  --help显示帮助---------一个选项列表。

  --safe-mode装载减去某些最佳配置的服务器。

  --verbose显示全文本消息(为获得更详细的帮助消息与--help联合使用);

  --version显示版本信息然后退出。

查看日志文件:

MySQL维护管理员依赖的一系列日志文件。主要的日志文件有以下几种。

错误日志:它包含启动和关闭问题以及任意关键错误的细节。此日志通常名为hostname.err,位于data目录中。此日志名可用--log-error命令行选项更改。

/var/log/mysqld.log

查询日志:它记录所有MySQL活动,在诊断问题时非常有用。此日志文件可能会很快地变得非常大,因此不应该长期使用它。此日志文件通常名为hostname.log,位于data目录中。此名字可以用--log命令行选项更改。

二进制日志:它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为hostname-bin,位于data目录内。此名字可以用--log-bin命令行选项更改。

缓慢查询日志:此日志记录执行缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为hostname-slow.log,位于data目录中。此名字可以用--log-slow-queries命令行选项更改。

使用日志时,可用FLUSH LOGS语句来刷新和重新开始所有日志文件。

3. 改善性能

(1)首先,MySQL(与所有DBMS一样)具有特定的硬件建议。

(2)一般来说,关键的生产DBMS应该运行在自己的专用服务器上。

(3)MySQL是用一系列的默认设置预先设置的,从这些设置开始通常是很好的。但过一段时间后可能需要调整内存分配、缓冲区大小等。(为查看当前设置,可使用SHOW VARIABLES;和SHOW STATUS;。)

(4)MySQL一个多用户多线程的DBMS,它通常同时执行多个任务。如果这些任务中的某一个执行缓慢,则所有请求都会执行缓慢。如果遇到显著的性能不良,可使用SHOW PROCESSLIST显示所有活动进程(以及它们的线程ID和执行时间)。还可以用KILL命令终结某种特定的进程(使用这个命令需要作为管理员登陆)。

(5)总有不止一种方法编写同一条SELECT语句。应该试验联结、并、子查询等,找出最佳的方法。

(6)使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句。

(7)一般来说,存储过程执行得比一条一条地执行其中的各条MySQL语句快。

(8)应该总是使用正确的数据类型。

(9)绝不要检索比需求还要多的数据。换言之,不要用SELECT *(除非真正需要每个列)。

(10)有的操作(包括INSERT)支持一个可选的DELAYED关键字,如果使用它,将把控制立即返回给调用程序,并且一旦有可能就实际执行该操作。

(11)在导入数据时,应该关闭自动提交。可能还想删除索引(包括FULLTEXT索引),然后在导入完成后再重建它们。

(12)必须索引数据库表以改善数据检索的性能。确定索引需要分析使用的SELECT语句找出重复的WHERE和ORDER BY子句。如果一个简单的WHERE子句返回结果所花的时间太长,则可以断定其中使用的列(或几个列)就是需要索引的对象。

(13)你的SELECT语句中有一系列复杂的OR条件吗?通过使用多条SELECT语句和连接它们的UNION语句,可以看到极大的性能改进。

(14)索引改善数据检索的性能,但损害数据插入、删除和更新的性能。如果有一些表,它们收集数据且不经常被搜索,则在有必要之前不要索引它们。(索引可根据需要添加和删除)。

(15)LIKE很慢。一般来说,最好使用FULLTEXT而不是LIKE。

(16)数据库是不断变化的实体。一组优化良好的表一会儿可能就面目全非了。由于表的使用和内容的更改,理想的优化和配置也会改变。

(17)最重要的规则就是,每条规则在某些条件下都会被打破。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12546367.html