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)最重要的规则就是,每条规则在某些条件下都会被打破。