当前位置:首页 > 网络编程 > 数据库 > Mysql > MySQL优化全攻略-相关数据库命令

MySQL优化全攻略-相关数据库命令

点击次数:14 次 发布日期:2008-11-22 09:05:10 作者:源代码网
源代码网推荐

源代码网整理以下我们讨论的是数据库性能优化的另一方面,即运用数据库服务器内建的工具辅助性能分析和优化。

源代码网整理以下▲ SHOW

源代码网整理以下执行下面这个命令可以了解服务器的运行状态:mysql >show status;

源代码网整理以下该命令将显示出一长列状态变量及其对应的值,其中包括:被中止访问的用户数量,被中止的连接数量,尝试连接的次数,并发连接数量最大值,以及其他许多有用的信息。这些信息对于确定系统问题和效率低下的原因是十分有用的。

源代码网整理以下SHOW命令除了能够显示出MySQL服务器整体状态信息之外,它还能够显示出有关日志文件、指定数据库、表、索引、进程和许可权限表的宝贵信息。

源代码网整理以下▲ EXPLAIN

源代码网整理以下EXPLAIN能够分析SELECT命令的处理过程。这不仅对于决定是否要为表加上索引很有用,而且对于了解MySQL处理复杂连接的过程也很有用。

源代码网整理以下下面这个例子显示了如何用EXPLAIN提供的信息逐步地优化连接查询。(本例来自MySQL文档,见http://www.mysql.com/doc/E/X/EXPLAIN.html。原文写到这里似乎有点潦草了事,特加上此例。)

源代码网整理以下假定用EXPLAIN分析的SELECT命令如下所示:

源代码网整理以下EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,

源代码网整理以下tt.ProjectReference, tt.EstimatedShipDate,

源代码网整理以下tt.ActualShipDate, tt.ClientID,

源代码网整理以下tt.ServiceCodes, tt.RepetitiveID,

源代码网整理以下tt.CurrentProcess, tt.CurrentDPPerson,

源代码网整理以下tt.RecordVolume, tt.DPPrinted, et.COUNTRY,

源代码网整理以下et_1.COUNTRY, do.CUSTNAME

源代码网整理以下FROM tt, et, et AS et_1, do

源代码网整理以下WHERE tt.SubmitTime IS NULL

源代码网整理以下AND tt.ActualPC = et.EMPLOYID

源代码网整理以下AND tt.AssignedPC = et_1.EMPLOYID

源代码网整理以下AND tt.ClientID = do.CUSTNMBR;

源代码网整理以下SELECT命令中出现的表定义如下:

源代码网整理以下表定义

源代码网整理以下表 列 列类型

源代码网整理以下tt ActualPC CHAR(10)

源代码网整理以下tt AssignedPC CHAR(10)

源代码网整理以下tt ClientID CHAR(10)

源代码网整理以下et EMPLOYID CHAR(15)

源代码网整理以下do CUSTNMBR CHAR(15)

源代码网整理以下索引

源代码网整理以下表 索引

源代码网整理以下tt ActualPC

源代码网整理以下tt AssignedPC

源代码网整理以下tt ClientID

源代码网整理以下et EMPLOYID (主键)

源代码网整理以下do CUSTNMBR (主键)

源代码网整理以下tt.ActualPC值分布不均匀

源代码网整理以下在进行任何优化之前,EXPLAIN对SELECT执行分析的结果如下:

源代码网整理以下table type possible_keys key key_len ref rows Extra

源代码网整理以下et ALL PRIMARY NULL NULL NULL 74

源代码网整理以下do ALL PRIMARY NULL NULL NULL 2135

源代码网整理以下et_1 ALL PRIMARY NULL NULL NULL 74

源代码网整理以下tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872

源代码网整理以下range checked for each record (key map: 35)

源代码网整理以下每一个表的type都是ALL,它表明MySQL为每一个表进行了完全连接!这个操作是相当耗时的,因为待处理行的数量达到每一个表行数的乘积!即,这里的总处理行数为74 * 2135 * 74 * 3872 = 45,268,558,720。

源代码网整理以下这里的问题之一在于,如果数据库列的声明不同,MySQL(还)不能有效地运用列的索引。在这个问题上,VARCHAR和CHAR是一样的,除非它们声明的长度不同。由于tt.ActualPC声明为CHAR(10),而 et.EMPLOYID声明为CHAR(15),因此这里存在列长度不匹配问题。

源代码网整理以下为了解决这两个列的长度不匹配问题,用ALTER TABLE命令把ActualPC列从10个字符扩展到15字符,如下所示:mysql > ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

源代码网整理以下现在tt.ActualPC和et.EMPLOYID都是VARCHAR(15)了,执行EXPLAIN进行分析得到的结果如下所示:

源代码网整理以下table type possible_keys key key_len ref rows Extra

源代码网整理以下tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used

源代码网整理以下do ALL PRIMARY NULL NULL NULL 2135

源代码网整理以下range checked for each record (key map: 1)

源代码网整理以下et_1 ALL PRIMARY NULL NULL NULL 74

源代码网整理以下range checked for each record (key map: 1)

源代码网整理以下et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1

源代码网整理以下这还算不上完美,但已经好多了(行数的乘积现在少了一个系数74)。现在这个SQL命令执行大概需要数秒钟时间。 为了避免tt.AssignedPC = et_1.EMPLOYID以及tt.ClientID = do.CUSTNMBR比较中的列长度不匹配,我们可以进行如下改动:

源代码网整理以下mysql > ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),

源代码网整理以下MODIFY ClientID VARCHAR(15);

源代码网整理以下现在EXPLAIN显示的结果如下:

源代码网整理以下table type possible_keys key key_len ref rows Extra

源代码网整理以下et ALL PRIMARY NULL NULL NULL 74

源代码网整理以下tt ref AssignedPC,ClientID,ActualPC ActualPC 15 et.EMPLOYID 52 where used

源代码网整理以下et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1

源代码网整理以下do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1

源代码网整理以下这个结果已经比较令人满意了。余下的问题在于,默认情况下,MySQL假定tt.ActualPC列的值均匀分布,而事实上tt表的情况并非如此。幸而,我们可以很容易地让MySQL知道这一点:

源代码网整理以下shell > myisamchk --analyze PATH_TO_MYSQL_DATABASE/tt

源代码网整理以下shell > mysqladmin refresh

源代码网整理以下现在这个连接操作已经非常理想,EXPLAIN分析的结果如下:

源代码网整理以下table type possible_keys key key_len ref rows Extra

源代码网整理以下tt ALL AssignedPC,ClientID,ActualPC NULL NULL NULL 3872 where used

源代码网整理以下et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1

源代码网整理以下et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1

源代码网整理以下do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1

源代码网整理以下▲ OPTIMIZE

源代码网整理以下OPTIMIZE能够恢复和整理磁盘空间以及数据碎片,一旦对包含变长行的表进行了大量的更新或者删除,进行这个操作就非常有必要了。OPTIMIZE当前只能用于MyISAM和BDB表。

源代码网整理以下结束语:

源代码网整理以下从编译数据库服务器开始、贯穿整个管理过程,能够改善MySQL性能的因素实在非常多,本文只涉及了其中很小的一部分。尽管如此,我们希望本文讨论的内容能够对你有所帮助。

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华