MySQL详解(五):SQL性能优化

SQL性能优化

1.优化简介

MySQL优化,一方面是需要找出系统的瓶颈,提高MySQL数据库整体的性能;

另一方面需要合理的结构设计和参数调整,以提高用户操作响应的速度;

同时还需要尽可能的节省系统资源,以便系统可以提供更大的负荷的服务;

 

MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度;

 

例如:通过优化文件系统、提高磁盘I/O的读写速度;通过优化操作系统调度策略,提高MySQL在高负荷情况下的负载能力;

优化表结构、索引、查询语句等使查询响应更快;

 

在MySQL中,通过SHOW STATUS语句查询一些MySQL数据库的性能参数。

SHOW STATUS LIKE ‘value’;

其中,value是需要查询的参数值,一些常用的性能参数为:

Connections:连接MySQL服务器的次数;

Uptime:MySQL服务器上线时间

Slow_queries:

Com_insert:

Com_update:

Com_delete:删除操作的次数

 

查询MySQL服务器的慢查询次数:

SHOW STATUS LIKE ‘Slow_queries‘;

 

2.MySQL Query Optimizer概述

MySQL中有一个专门负责优化SELECT语句的优化器模块,该优化器模块就是Query Optimizer

它的主要模块是将客户端传递的查询语句,结合数据库系统收集的各种统计信息,为客户端的SQL进行查询优化,最终给出优化之后的查询语句;

 

当用户模块发送请求给MySQL命令解析器之后,MySQL命令解析器会将用户查询语句发送给MySQL查询优化器(Query Optimizer),然后对查询语句进行优化。例如常量的转化。无效内容的删除,常量计算等待等等;Query Optimizer会分析出来最优化数据检索的方式,也就是常说的执行计划;

 

MySQL Query Optimizer 的所有的工作都是基于Query Tree的。Query Tree是通过优化实现DBXP的经典数据结构和Tree构造器而生成的一个指导完成一个Query语句的请求所需要处理的工作步骤,通过Query Tree可以清楚地了解到一个Query完成所需要的经历的步骤,每一步的数据来源,以及处理方式等信息;

 

 

 

 

3.SQL语句优化的基本思路

【1、优化更需要优化的查询】

高并发低消耗的查询对于整个系统的影响远比低并发高消耗的查询大;

 

从对整个系统来分析,如果一个低并发的查询走错执行计划,所带来的影响主要只是该查询的请求者的体验会变差,对整体系统的影响并不会特别的突出;

如果一个高并发的查询走错了执行计划,那所带来的后果很可能是灾难性的;

 

【2、定位优化对象的性能瓶颈】

优化查询之前,首先需要看优化对象的性能瓶颈是读写问题还是CPU损耗问题,到底是数据运算方面耗费了太多的资源,还是在数据访问上耗费了太多的时间;

 

在MySQL5.0系列版本中,可以通过系统自带的PROFILING功能很清楚的找出一个查询的瓶颈所在;

 

 

【3、明确的优化目标】

 

【4、充分利用EXPLAIN和PROFILE工具对SQL语句进行分析】

http://blog.csdn.net/mchdba/article/details/9190771

http://www.cnblogs.com/xuanzhi201111/p/4175635.html

 

通过EXPLAIN工具可以查看该查询的执行计划。

mysql> EXPLAIN SELECT * FROM USER;

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

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |

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

| 1 | SIMPLE   | USER  | ALL  | NULL      | NULL | NULL  | NULL | 41  |     |

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

 

 

 

参数说明:

 

type:为ALL是最差的一种连接类型;

Extra:该参数显示了MySQL在处理查询时的详细信息,主要包括:

1、using index:出现该参数说明MySQL使用了覆盖索引,避免访问了表的数据行,效率不错;

2、using where:这说明服务器在存储引擎收到行后将进行过滤;

3、using temporary:这意味着MySQL对查询结果进行排序的时候使用了一张临时表

4、using filesort:这个说明MySQL会对数据使用一个外部的索引排序;

 

如果出现了using temporary、using filesort的时候,需要对查询语句进行优化操作;

在了解了EXPLAIN用法之后,我们可以通过分析EXPLAIN返回的每一项结果,就能够清楚地知道查询大致运行的时间。如果查询中没有使用到索引,或者扫描的行过多,那么需要改变查询的方式或者建立索引;

 

Btree索引的工作原理,先对第列进行排序,如果遇到相同的值,对第二个列进行排序,依次类推;

【MySQL索引失效的问题】

http://www.jb51.net/article/50649.htm

http://www.cnblogs.com/angryprogrammer/p/4304932.html

 

4.利用EXPLAIN分析查询语句

通过对查询语句的分析,可以了解插叙语句的执行情况,找出查询语句执行的瓶颈,从而优化查询语句。MySQL提供了EXPLAIN语句,用来分析查询语句。

 

【EXPLAIN语句的基本语法】

EXPLAIN [EXTENDED] SELECT  select_options

使用EXPLAIN 关键字,EXPLAIN语句将产生附加信息。select_options是SELECT 语句的查询选项,包括FROM WHERE子句等;

 

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |

 

参数说明:

  1. id

SELECT 识别符。这是SELECT 的查询序列号。id的值越大优先级别越高,越先被执行。如果id相同,执行顺序由上至下;

  1. select_type

select_type表示SELECT语句的类型。可以取值如下

(1)SIMPLE:表示简单查询,其中不包括连接查询和子查询;

(2)PRIMARY:表示主查询或者是最外层的查询语句;

(3)UNION和UNION RESULT:表示连接查询的第2个或者后面的查询语句,不依赖于外部查询的结果集。而UION RESULT 表示UNION查询的结果集;

(4)DEPENDENT UNION:

DEPENDENT UNION连接查询中的第2个或者后面的SELECT语句,取决于外面的查询;

(5)SUBQUERY:

         SUBQUERY子查询中的第1个SELECT语句,不依赖于外部查询的结果集。

(6)DEPENDENT SUBQUERY:

         DEPENDENT SUBQUERY子查询中的第1个SELECT,取决于外面的查询;   

(7)DERIVED:

         DERIVED查询类型用于from子句里面有子查询的情况。MySQL会递归执行这些子查询,把结果放在临时表中。

  1. table

table表示显示这一行数据是关于哪张表的。有可能看到的不是真实的表名字,而是derivedx(X是个数字)。

  1. type

type表示表的连接类型。下面按照最佳类型到最差类型的顺序给出各种连接类型:

(1)system

该表是仅有一行的系统表,这是const连接类型的一个特例;

(2)const

数据表最多只有一个匹配行,它将在查询开始的时候被读取,并在余下的查询优化中作为常量对待。const表查询速度很快,因为它们只读取一次。const用于使用常数值比较PRIMARY KEY或者UNIQUE索引的所有部分的场合;

(3)eq_ref:

对于每个来自前面的表的行组合,从该表中读取一行。当一个索引的所有部分都在查询中使用并且索引是UNIQUE或者PRIMARY KEY的时候,即可使用这种类型;

eq_ref可以用于使用“=”操作符比较呆索引的列。比较值可以为常量或则一个在该表前面所读取的表的列的表达式;

(4)ref:

         对于来自前面的表的任意行组合,将从该表中读取所有匹配的行。这种类型用于索引即不是UNIQUE也不是PRIMARY KEY的情况,或者查询中使用了索引列的左子集,即索引中左边的部分列组合。ref可以用于使用=或者<=>操作符的带索引的列;

(5)ref_or_null:

         该连接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该连接类型的优化。

(6)index_merge:

         该连接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素;

(7)unique_subquery:

         该类型替换了下面形式的IN子查询的ref:

         unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高;

(8)index_subquery:

         该连接类型类似于uniquery_subquery,可以替换IN子查询,但只适用下列形式的子查询中的非唯一索引;

(9)range:

         只检索给定范围的行,适用一个索引来选择行。key列显示适用了哪个索引。key_len包含所使用索引的最长关键元素。

         当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字字列的时候,类型为range;

(10)index:

         该连接类型与ALL相同,除了只扫描索引树。这通常比ALL块,因为索引文件通常比数据文件小;

(11)ALL

         对于前面的表的任意行组合,进行完整的表扫描。如果表是第一个没标记const的表,这样不好,并且在其他任何情况下很差。通常可以增加更多的索引来避免使用ALL连接;

  1. possible_keys

possible_keys列指出MySQL能使用哪个索引在该表中找到行。如果该列是NULL则没有相关的索引。在这种情况下,可以通过检查WHERE子句看它是否引用某些列或者适合索引的列来提高查询性能。如果是这样,可以创建适合的索引来提高查询的性能;

  1. key

key表示查询实际用到的索引,如果没有选择索引,该列的值是NULL。要想强制MySQL使用或者忽略possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNIRE INDEX;

  1. key_len

key_len表示MySQL选择的索引字段按字节计算的长度,如果键是NULL,则长度为NULL。注意通过key_len值可以确定MySQL将实际使用一个多列索引中的几个字段;

  1. ref

ref表示使用哪个列或者常数与索引一起来查询记录;

  1. rows

rows显示MySQL在表中进行查询的时候必须检查的行数;

  1. Extra

extra列显示MySQL在处理查询的时候的详细信息;主要包括以下信息:

using index:出现这个说明MySQL使用了覆盖索引,避免访问了表的行,效率不错;

using where:这说明服务器在存储引擎收到行之后将进行过滤;

using temporary:这意味着MySQL对查询结果进行排序的时候使用了一张临时表

using filesort:这个说明MySQL会对数据使用一个外部索引排序;

当出现using temporary或者using filesort的时候,需要对查询语句进行优化操作;

5.利用Profiling分析查询语句

MySQL的Profile是一个使用非常方便的查询诊断分析工具,通过该工具可以获取一条查询在整个执行过程中多种资源的消耗情况,例如内存消耗、I/O消耗和CPU消耗等;

Profile的语法规则如下:

SHOW PROFILE [type [,type]…]

[FOR QUERY n]

[LIMIT row_conunt [OFFSET offset]]

 

其中,type参数说明:

ALL:显示所有的信息;

BLOCK IO:显示输入输出操作阻塞的数量;

CONSTEXT SWITCHES:显示自动或者非自动CONTEXT SWITCHES的数量;

CPU:显示系统和用户CPU使用的时间;

IPC:显示信息发送和接受的数量;

MEMORY:内存的信息;

PAGE FAULTS:显示主要的PAGE FAULTS数量;

SOURCE:显示函数的名称,并且显示函数所在文件的名字和行数;

SWAPS:显示SWAP数量;

 

【查询profile是否开启】

mysql> select @@profiling;

 

【开启profiling】

mysql > SET profiling = 1;

 

【查看已经执行的SQL语句的Profiling情况】

mysql > show profiles;

 

 

6.合理地使用索引

索引是数据库优化的最重要的方法之一;

1.索引对查询速度的影响

MySQL中提高性能的一个最有效地方式就是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此,索引对查询的速度有着至关重要的影响。使用索引可以快速的定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。

 

如果查询的时候没有使用索引,查询语句将会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。如果使用索引进行查询,查询语句可以根据索引快速的定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的;

 

 

2.如何使用索引查询

索引可以提高查询的速度。但并不是使用带有索引的字段查询的时候,索引都会起作用。

使用索引有几种特殊的情况,在这些情况下,有可能使用带有索引的字段查询的时候,索引并没有起作用。下面重点介绍这几种特殊情况:

【1、使用LIKE关键字的查询语句】

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引并不会起作用。只有“%”不在第一个位置的时候,索引才会起作用;

 

【2、使用多列索引的查询语句】

MySQL可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中第1个字段的时候,索引才会被使用;

 

【3、使用OR关键字的查询语句】

查询语句的查询条件中只有OR关键字,并且OR前后的两个条件中的列都是索引的时候,查询中才使用索引。否则,查询将不使用索引;

 

7.不同类型SQL语句优化方法

1.优化INSERT语句

当进行数据INSERT的时候,MySQL客户端大致需要经过如下的步骤:

客户端连接MySQL服务器;

客户端发送INSERT语句到服务器;

服务器解析INSERT语句;

服务器增加数据;

服务器个增加的记录添加索引;

服务器关闭连接;

【优化INSERT语句的常见方法有如下几种】

(1)如果一次性插入多个值,将大大的缩短客户端与数据库服务器之间的连接和关闭等操作;

当从一个文本文件载入一个表的时候,使用LOAD DATA INFILE加载数据往往比使用很多的INSERT语句效率至少提高20倍;

(2)对于MyISAM类型的表,如果从不同客户端插入很多行,可以通过使用INSERT DELAYED语句提升执行速度。INSERT DELAYED INTO是客户端提交数据给MySQL服务器,MySQL服务器返回OK状态给客户端,而这并不是将数据立即插入到表,而是存储在内存里面排队,直到当MySQL服务器有空闲的时候再插入。此时数据并没有真正的写入磁盘,这样的好处是提高插入数据的速度,不好的地方在于,如果系统崩溃,MySQL还没有写入磁盘的数据将会丢失;

(3)通常可以锁定表以加速插入数据,命令如下:

mysql> lock tables 表名 write;

 

mysql > insert into 表名 values(),()…;

mysql > unlock tables;

如果不加锁定表,每一次执行INSERT语句完成之后,索引缓冲区都会被写入到磁盘上,而加入锁定后索引缓冲区仅仅被写到磁盘一次;

2.优化ORDER BY语句

在某些情况下,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序;

通常可以采用索引来对ORDER BY语句进行优化;

 

下面介绍几个常用优化ORDER BY+LIMIT组合的索引优化,SQL形式如下:

(1)对ORDER BY + LIMIT组合的索引优化,SQL形式如下:

SELECT [column1] … FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];

 

该SQL语句优化只需要在[sort]上建立索引即可;

 

(2)对WHERE + ORDER BY +LIMIT组合的索引优化,SQL形式如下:

SELECT [column1] … FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT [offset],[LIMIT];

 

此时如果只对[sort]添加索引,效率并不是很高,还可以采用更加高效的方法建立一个联合索引(columnX,sort);

 

(3)不要对WHERE 和ORDER BY的选项使用表达式或者函数,SQL形式如下:

SELECT * FROM [TABLE] ORDER BY YEAR(date) LIMIT 0,30;

 

 

下面几种情况不应该使用索引:

(1)order by 的字段混合使用asc和desc;

mysql > select * from ordertable order by col1 desc,col2 asc;

 

(2)where子句使用的字段和order by 的字段不一致

mysql > select * from ordertable where col1 =1 order by col2;

 

(3)对不同的关键字使用order by 排序;

mysql > select * from ordertable order by col1,col2;

 

 

3.优化GROUP BY语句

使用GROUP BY语句的时候,MySQL会对符合的结果自动排序。通过扫描整个表并创建一个新的临时表,表中每个组的所有行应该为连续的,然后使用该临时表来找到组并应用累计行数。在某些情况下,MySQL可以通过索引访问而不用临时表;

         通过指定ORDER BY NULL可以禁止排序,从而节省损耗。

select id,count(data) from test group by id order by null\G;

使用了order by null的group by 语句减少了文件排序的步骤,当返回结果集很大的时候,对于group by的性能是由很大的改善的;

 

 

4.优化嵌套查询

子查询可以进行SELECT 语句的嵌套查询,即一个SELECT 查询的结果作为另一个SELECT语句的条件,子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然可以是的查询语句很灵活,但执行效率不高。执行子查询的时候,MySQL需要为内层的查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕之后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大;

 

在MySQL中可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快,如果查询中使用索引的话,性能会更好。连接之所以有效率,是因为MySQL不需要在内存中创建临时表来完成查询工作;

5.优化OR条件

对于使用OR条件语句的子查询,如果需要使用索引,则OR之间的每个条件列都必须使用到索引。如果没有索引,可以考虑添加索引;

6.优化插入记录的速度

插入记录的时候,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。根据这些情况,可以分别进行优化。

 

对于MyISAM存储索引的表的插入记录的优化

 

【1、禁用索引】

对于非空表,插入记录的时候,MySQL会根据表的索引对插入记录建立索引。如果插入大量的数据,建立索引会降低插入记录的速度。为了解决这种情况,可以在插入记录之前禁用索引,数据插入完毕之后再开启索引;

 

ALTER TABLE table_name DISABLE KEYS;

 

其中开启索引的语句如下:

ALTER TABLE table_name ENABLE KEYS;

 

对于空表批量导入数据,则不需要进行此操作,因为MyISAM引擎的表是在导入数据之后才建立索引的;

【2、禁用唯一性检查】

插入数据的时候,MySQL会对插入记录进行唯一性校验。这种唯一性校验也会降低插入记录的速度。为了降低这种情况对查询速度的影响,可以在插入记录之前禁用唯一性检查,等到记录插入完毕之后再开启。禁用唯一性检查的语法:

SET UNIQUE_CHECKS=0;

开启唯一性检查的语句:

SET UNIQUE_CHECKS=1;

【3、使用批量插入】

插入多条记录的时候,可以使用一条INSERT语句插入一条记录;也可以使用一条INSERT语句插入多条记录。

 

 

【4、使用LOAD命令批量导入】

MySQL批量导入数据的时候,可以采用load命令提高导入的速度,对于MyISAM存储引擎,可以通过以下方式快速的导入大量的数据;

ALTER TABLE tbname DISABLE KEYS;

loading the data

ALTER TABLE tbname ENABLE KEYS;

 

这两个命令用来打开或者关闭MyISAM表非唯一性索引的更新。在导入大量的数据到一个空的MyISAM表的时候,默认就是先导入数据,然后才创建索引;而在导入大量的数据到一个非空的MyISAM表的时候,通过以上的命令的设置,可以提高导入数据的效率;

 

 

 

 

对于InnoDB存储索引的表的插入记录的优化

【1、禁用唯一性检查】

插入数据之前执行set  unique_checks=0来禁止对唯一性索引的检查,数据导入完成之后再运行set unique_checks=1.这个和MyISAM存储索引的使用方法一致;

【2、禁用外键检查】

插入数据之前执行禁止对外键的检查,数据插入完成之后再恢复对外键的检查。禁用外键检查的语句如下:

SET  foreign_key_checks=0;

 

恢复外键检查语法:

SET foreign_key_checks=1;

【3、禁用自动提交】

在导入数据之前执行SET AUTOCOMMIT=0,关闭自动提交功能,在成功导入数据之后,执行SET AUTOCOMMIT=1,恢复自动提交功能,可以提高导入的效率;

 

 

 

8.优化数据库结构

一个好的数据库设计方案对于数据库的性能常常会起到事半功倍的效果。合理的数据库结构不仅可以使数据库占用更小的磁盘空间,而且能够使得查询的速度更快。数据库结构的设计,需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

1.将字段很多的表分解成多个表

对于字段较多的表,如果有些字段的使用频率较低,可以将这些字段分离出来形成新的表。因为当一个表的数据量很大的时候,会由于使用频率的字段的存在而变慢。

 

 

通过这种分解,可以提高表的查询效率。对于字段很多并且有些字段使用不频繁的表,可以通过这种分解的方式来优化数据库的性能;

2.增加中间表

对于需要经常联合查询的表可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,依次来提高查询效率。

3.增加冗余字段

设计数据库的时候应该尽量的遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来更加的精致、优雅。但是,合理地加入冗余字段也可以提高查询的速度。

 

         表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。

 

提示,冗余字段会导致一些问题,比如,冗余字段的值在一个表中被修改了,就要想办法在其他的表中更新该字段。否则就会使得原本一致的数据变得不一致。分解表、增加中间表和增加冗余表字段都浪费了一定的磁盘空间。从数据库性能来看,为了提高查询速度而增加少量的冗余大部分的时候是可以接受的;是否通过增加冗余字段来提高数据库的性能,这要根据实际的需求综合进行分析;

9.分析表、检查表和优化表

MySQL提供了分析表、检查表和优化表的语句。

分析表主要是分析关键字的分布;

检查表主要是检查是否存在错误;

优化表主要是消除删除或者更新造成的空间浪费。

1.分析表

MySQL中提供了ANALYZE TABLE语句分析表,ANALYZE TABLE 语句的基本语法如下:

ANALYZE [LOCAL] NO_WRITE_TO_BINLOG TABLE tb1_name [,tb1_name]…

 

LOCAL 关键字是NO_WRITE_TO_BINLOG关键字的别名,二者都是执行过程不写入二进制文件。

2.检查表

MySQL中可以使用CHECK TABLE语句来检查表。CHECK TABLE语句能够检查InnoDB和MyISAM类型的表是否存在错误。对于MyISAM类型的表,CHECK TABLE语句还会更新关键字统计数据。而且,CHECK TABLE也可以检查视图是否有错误,比如在视图定义中被引用的表已经不存在。该语句的基本语法如下:

CHECK TABLE tb_name [,tb1_name] … [option] … option={QUICK|FAST|MEDIUM|EXTENDED|CHANGED}

参数说明:

QUICK:不扫描行,不检查错误的连接;

FAST:只检查没有被正确关闭的表;

MEDIUM:扫描行,用以验证被删除的连接是有效的,也可以计算各行的关键字校验和,并使用计算出校验和验证这一点;

EXTENDED: 对每行的所有关键字进行一个全面的关键字查找,这可以确保表是100%一致的,但是花的时间较长;

CHANGED:只检查上次检查之后被更改的表和没有被正确关闭的表;

 

option只对MyISAM类型的表有效,对InnoDB类型的表无效。CHECK TABLE语句在执行的过程中也会给表加上只读锁;

3.优化表

MySQL中使用OPTIMIZE TABLE语句来优化表。该语句对InnoDB和MyISAM类型的表都有效。但是OPTIMIZE TABLE语句只能优化表中的VARCHAR、BLOB、或者TEXT类型的字段。

OPTIMIZE TABLE语句的基本语法如下:

OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE tb_name [,tb_name] …

 

参数说明:

LOCAL 关键字是NO_WRITE_TO_BINLOG关键字的别名,二者都是执行过程不写入二进制文件。

通过OPTIMIZE TABLE语句可以消除删除和更新造成的文件碎片。OPTIMIZE TABLE在语句执行过程中也会给表加上只读锁;

提示:

一个表使用了TEXT或者BLOB这样的数据类型,如果已经删除了表的一大部分,或者已经对含有可变长度行的表(含有VARCHAR、BLOB、或者TEXT类型的字段列的表)进行了很多的更新,则应该使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。在多数的设置中,根本不需要运行OPTIMIZE TABLE。即使对可变长度的行进行了大量的更新,也不需要经常运行,每周一次或者每月一次即可,并且只需要对特定的表运行;

 

 

猜你喜欢

转载自blog.csdn.net/qq_36807862/article/details/81289066