<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>haohtml&#039;s blog &#187; mysql</title>
	<atom:link href="http://blog.haohtml.com/index.php/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.haohtml.com</link>
	<description>haohtml&#039;s life and works blog</description>
	<lastBuildDate>Sat, 31 Jul 2010 10:45:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺：</title>
		<link>http://blog.haohtml.com/index.php/archives/4760</link>
		<comments>http://blog.haohtml.com/index.php/archives/4760#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:50:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4760</guid>
		<description><![CDATA[可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺： mysql&#62; show status like &#8216;Table%&#8217;; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+ &#124; Variable_name        &#124; Value &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+ &#124; Table_locks_immediate &#124; 105         &#124; &#124; Table_locks_waited   &#124; 3           &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+ 2 rows in set (0.00 sec) 如果Table_locks_waited的值比较高，则说明存在着较严重的表级锁争用情况。这时，需要我们对应用做进一步的检查，来确定问题所在。 Table_locks_immediate 指的是能够立即获得表级锁的次数，而Table_locks_waited指的是不能立即获取表级锁而需要等待的次数。如果 Table_locks_waited的值比较大的话，并且你遇到了性能问题，你可能希望将大表切分成小表；例如，你可以为一个定制模块创建一个专有的缓存（cache）表，或者通过其它方式来减小表的大小，或者降低表级锁命令调用的频率。对于一些表，比如cache_*，Watchdog， 和 accesslog表，减少表的大小的一种方式是减少数据的生命周期。]]></description>
			<content:encoded><![CDATA[<p>可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺：</p>
<p>mysql&gt; show status like &#8216;Table%&#8217;;</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+</p>
<p>| Variable_name         | Value  |</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+</p>
<p>| Table_locks_immediate | 105          |</p>
<p>| Table_locks_waited    | 3             |</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+</p>
<p>2 rows in set (0.00 sec)</p>
<p>如果Table_locks_waited的值比较高，则说明存在着较严重的表级锁争用情况。这时，需要我们对应用做进一步的检查，来确定问题所在。</p>
<div>Table_locks_immediate 指的是能够立即获得表级锁的次数，而Table_locks_waited指的是不能立即获取表级锁而需要等待的次数。如果 Table_locks_waited的值比较大的话，并且你遇到了性能问题，你可能希望将大表切分成小表；例如，你可以为一个定制模块创建一个专有的缓存（cache）表，或者通过其它方式来减小表的大小，或者降低表级锁命令调用的频率。对于一些表，比如cache_*，Watchdog， 和  accesslog表，减少表的大小的一种方式是减少数据的生命周期。</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4760/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL内存使用-线程独享</title>
		<link>http://blog.haohtml.com/index.php/archives/4753</link>
		<comments>http://blog.haohtml.com/index.php/archives/4753#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:02:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4753</guid>
		<description><![CDATA[对于任何一个数据库管理系统来说，内存的分配使用绝对可以算的上是其核心之一了，所以很多希望更为深入了解某数据库管理系统的人，都会希望一窥究竟，我也不例外。 从内存的使用方式MySQL 数据库的内存使用主要分为以下两类 * 线程独享内存 * 全局共享内存 今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。 在 MySQL 中，线程独享内存主要用于各客户端连接线程存储各种操作的独享数据，如线程栈信息，分组排序操作，数据读写缓冲，结果集暂存等等，而且大多数可以通过相关参数来控制内存的使用量。 线程栈信息使用内存(thread_stack)：主要用来存放每一个线程自身的标识信息，如线程id，线程运行时基本信息等等，我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。 排序使用内存(sort_buffer_size)：MySQL 用此内存区域进行排序操作（filesort），完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候，MySQL 会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级，所以sort_buffer_size参数对排序操作的性能影响绝对不可 小视。排序操作的实现原理请参考：MySQL Order By 的实现分析。 Join操作使用内存(join_buffer_size)：应用程序经常会出现一些两表（或多表）Join的操作需求，MySQL在完成某些 Join 需求的时候（all/index join），为了减少参与Join的“被驱动表”的读取次数以提高性能，需要使用到 Join Buffer 来协助完成 Join操作（具体 Join 实现算法请参考：MySQL 中的 Join 基本实现原理）。当 Join Buffer 太小，MySQL 不会将该 Buffer 存入磁盘文件，而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作，然后清空 Join Buffer 中的数据，继续将剩余的结果集写入此 Buffer 中，如此往复。这势必会造成被驱动表需要被多次读取，成倍增加 IO [...]]]></description>
			<content:encoded><![CDATA[<p>对于任何一个数据库管理系统来说，内存的分配使用绝对可以算的上是其核心之一了，所以很多希望更为深入了解某数据库管理系统的人，都会希望一窥究竟，我也不例外。</p>
<p>从内存的使用方式MySQL 数据库的内存使用主要分为以下两类</p>
<p>* 线程独享内存<br />
* 全局共享内存</p>
<p>今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。<br />
<span id="more-4753"></span><br />
在 MySQL 中，线程独享内存主要用于各客户端连接线程存储各种操作的独享数据，如线程栈信息，分组排序操作，数据读写缓冲，结果集暂存等等，而且大多数可以通过相关参数来控制内存的使用量。</p>
<p><strong>线程栈信息使用内存(thread_stack)：</strong>主要用来存放每一个线程自身的标识信息，如线程id，线程运行时基本信息等等，我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。</p>
<p><strong>排序使用内存(sort_buffer_size)：</strong>MySQL  用此内存区域进行排序操作（filesort），完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候，MySQL  会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级，所以sort_buffer_size参数对排序操作的性能影响绝对不可 小视。排序操作的实现原理请参考：MySQL Order By 的实现分析。</p>
<p><strong>Join操作使用内存(join_buffer_size)：</strong>应用程序经常会出现一些两表（或多表）Join的操作需求，MySQL在完成某些  Join 需求的时候（all/index join），为了减少参与Join的“被驱动表”的读取次数以提高性能，需要使用到 Join Buffer  来协助完成 Join操作（具体 Join 实现算法请参考：MySQL 中的 Join 基本实现原理）。当 Join Buffer  太小，MySQL 不会将该 Buffer 存入磁盘文件，而是先将Join Buffer中的结果集与需要 Join 的表进行 Join  操作，然后清空 Join Buffer 中的数据，继续将剩余的结果集写入此 Buffer  中，如此往复。这势必会造成被驱动表需要被多次读取，成倍增加 IO 访问，降低效率。</p>
<p><strong>顺序读取数据缓冲区使用内存(read_buffer_size)：</strong>这部分内存主要用于当需要顺序读取数据的时候，如无发使用索引的情况下的全表 扫描，全索引扫描等。在这种时候，MySQL 按照数据的存储顺序依次读取数据块，每次读取的数据快首先会暂存在read_buffer_size中，当  buffer 空间被写满或者全部数据读取结束后，再将buffer中的数据返回给上层调用者，以提高效率。</p>
<p><strong>随机读取数据缓冲区使用内存(read_rnd_buffer_size)：</strong>和顺序读取相对应，当 MySQL  进行非顺序读取（随机读取）数据块的时候，会利用这个缓冲区暂存读取的数据。如根据索引信息读取表数据，根据排序后的结果集与表进行Join等等。总的来 说，就是当数据块的读取需要满足一定的顺序的情况下，MySQL 就需要产生随机读取，进而使用到 read_rnd_buffer_size  参数所设置的内存缓冲区。</p>
<p><strong>连接信息及返回客户端前结果集暂存使用内存(net_buffer_size)：</strong>这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。 当 MySQL 开始产生可以返回的结果集，会在通过网络返回给客户端请求线程之前，会先暂存在通过 net_buffer_size  所设置的缓冲区中，等满足一定大小的时候才开始向客户端发送，以提高网络传输效率。不过，net_buffer_size  参数所设置的仅仅只是该缓存区的初始化大小，MySQL 会根据实际需要自行申请更多的内存以满足需求，但最大不会超过  max_allowed_packet 参数大小。</p>
<p><strong>批量插入暂存使用内存(bulk_insert_buffer_size)：</strong>当我们使用如 insert …  values(…),(…),(…)… 的方式进行批量插入的时候，MySQL  会先将提交的数据放如一个缓存空间中，当该缓存空间被写满或者提交完所有数据之后，MySQL  才会一次性将该缓存空间中的数据写入数据库并清空缓存。此外，当我们进行 LOAD DATA INFILE 操作来将文本文件中的数据 Load  进数据库的时候，同样会使用到此缓冲区。</p>
<p><strong>临时表使用内存(tmp_table_size)：</strong>当我们进行一些特殊操作如需要使用临时表才能完成的 Order By，Group By  等等，MySQL 可能需要使用到临时表。当我们的临时表较小（小于 tmp_table_size 参数所设置的大小）的时候，MySQL  会将临时表创建成内存临时表，只有当 tmp_table_size 所设置的大小无法装下整个临时表的时候，MySQL 才会将该表创建成  MyISAM 存储引擎的表存放在磁盘上。不过，当另一个系统参数 max_heap_table_size 的大小还小于  tmp_table_size 的时候，MySQL 将使用 max_heap_table_size 参数所设置大小作为最大的内存临时表大小，而忽略  tmp_table_size 所设置的值。而且 tmp_table_size 参数从 MySQL 5.1.2 才开始有，之前一直使用  max_heap_table_size。</p>
<p>上面所列举的 MySQL 线程独享内存仅仅只是所有线程独享内存中的部分，并不是全部，选择的原则是可能对 MySQL 的性能产生较大的影响，且可以通过系统参数进行调节。</p>
<p>由于以上内存都是线程独享，极端情况下的内存总体使用量将是所有连接线程的总倍数。所以各位朋友在设置过程中一定要谨慎，切不可为了提升性能就盲目的增大各参数值，避免因为内存不够而产生 Out Of Memory 异常或者是严重的 Swap 交换反而降低整体性能。</p>
<p>内容方面有任何技术问题，欢迎各位朋友来拍砖，交流分享的过程也是对自身的提升。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4753/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqlbinlog：处理mysql binlog二进制日志文件的实用工具</title>
		<link>http://blog.haohtml.com/index.php/archives/4725</link>
		<comments>http://blog.haohtml.com/index.php/archives/4725#comments</comments>
		<pubDate>Tue, 20 Jul 2010 11:38:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqlbinlog]]></category>
		<category><![CDATA[日志]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4725</guid>
		<description><![CDATA[服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件，应使用mysqlbinlog实用工具。 应这样调用mysqlbinlog： shell&#62; mysqlbinlog [options] log-files&#8230; 例如，要想显示二进制日志binlog.000003的内容，使用下面的命令： shell&#62; mysqlbinlog binlog.0000003 输出包括在binlog.000003中包含的所有语句，以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。 通常情况，可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用–read-from-remote-server选项从远程服务器读取二进制日志。 当读取远程二进制日志时，可以通过连接参数选项来指示如何连接服务器，但它们经常被忽略掉，除非你还指定了–read-from-remote-server选项。这些选项是–host、–password、–port、–protocol、–socket和–user。 还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。 在5.11.3节，“二进制日志”中详细讨论了二进制日志。 mysqlbinlog支持下面的选项： · &#8212;help，-？ 显示帮助消息并退出。 · &#8212;database=db_name，-d db_name 只列出该数据库的条目(只用本地日志)。 · &#8211;force-read，-f 使用该选项，如果mysqlbinlog读它不能识别的二进制日志事件，它会打印警告，忽略该事件并继续。没有该选项，如果mysqlbinlog读到此类事件则停止。 · &#8211;hexdump，-H 在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。 · &#8211;host=host_name，-h host_name 获取给定主机上的MySQL服务器的二进制日志。 · &#8211;local-load=path，-l pat 为指定目录中的LOAD DATA INFILE预处理本地临时文件。 · &#8211;offset=N，-o N 跳过前N个条目。 · &#8211;password[=password]，-p[password] 当连接服务器时使用的密码。如果使用短选项形式(-p)，选项和 密码之间不能有空格。如果在命令行中&#8211;password或-p选项后面没有 密码值，则提示输入一个密码。 · &#8211;port=port_num，-P port_num 用于连接远程服务器的TCP/IP端口号。 · &#8211;position=N，-j [...]]]></description>
			<content:encoded><![CDATA[<p>服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件，应使用mysqlbinlog实用工具。<br />
应这样调用mysqlbinlog：</p>
<blockquote><p>shell&gt; mysqlbinlog [options] log-files&#8230;<br />
例如，要想显示二进制日志binlog.000003的内容，使用下面的命令：</p>
<p>shell&gt; mysqlbinlog binlog.0000003<br />
输出包括在binlog.000003中包含的所有语句，以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等。</p></blockquote>
<p>通常情况，可以使用mysqlbinlog直接读取二进制日志文件并将它们用于本地MySQL服务器。也可以使用–read-from-remote-server选项从远程服务器读取二进制日志。</p>
<p>当读取远程二进制日志时，可以通过连接参数选项来指示如何连接服务器，但它们经常被忽略掉，除非你还指定了–read-from-remote-server选项。这些选项是–host、–password、–port、–protocol、–socket和–user。<span id="more-4725"></span></p>
<p>还可以使用mysqlbinlog来读取在复制过程中从服务器所写的中继日志文件。中继日志格式与二进制日志文件相同。<br />
在5.11.3节，“二进制日志”中详细讨论了二进制日志。</p>
<blockquote><p>mysqlbinlog支持下面的选项：</p>
<p>·         &#8212;help，-？</p>
<p>显示帮助消息并退出。</p>
<p>·         &#8212;database=db_name，-d db_name</p>
<p>只列出该数据库的条目(只用本地日志)。</p>
<p>·         &#8211;force-read，-f</p>
<p>使用该选项，如果mysqlbinlog读它不能识别的二进制日志事件，它会打印警告，忽略该事件并继续。没有该选项，如果mysqlbinlog读到此类事件则停止。</p>
<p>·         &#8211;hexdump，-H</p>
<p>在注释中显示日志的十六进制转储。该输出可以帮助复制过程中的调试。在MySQL 5.1.2中添加了该选项。</p>
<p>·         &#8211;host=host_name，-h host_name</p>
<p>获取给定主机上的MySQL服务器的二进制日志。</p>
<p>·         &#8211;local-load=path，-l pat</p>
<p>为指定目录中的LOAD DATA INFILE预处理本地临时文件。</p>
<p>·         &#8211;offset=N，-o N</p>
<p>跳过前N个条目。</p>
<p>·         &#8211;password[=password]，-p[password]</p>
<p>当连接服务器时使用的密码。如果使用短选项形式(-p)，选项和 密码之间不能有空格。如果在命令行中&#8211;password或-p选项后面没有 密码值，则提示输入一个密码。</p>
<p>·         &#8211;port=port_num，-P port_num</p>
<p>用于连接远程服务器的TCP/IP端口号。</p>
<p>·         &#8211;position=N，-j N</p>
<p>不赞成使用，应使用&#8211;start-position。</p>
<p>·         &#8211;protocol={TCP | SOCKET | PIPE | -position</p>
<p>使用的连接协议。</p>
<p>·         &#8211;read-from-remote-server，-R</p>
<p>从MySQL服务器读二进制日志。如果未给出该选项，任何连接参数选项将被忽略。这些选项是&#8211;host、&#8211;password、&#8211;port、&#8211;protocol、&#8211;socket和&#8211;user。</p>
<p>·         &#8211;result-file=name, -r name</p>
<p>将输出指向给定的文件。</p>
<p>·         &#8211;short-form，-s</p>
<p>只显示日志中包含的语句，不显示其它信息。</p>
<p>·         &#8211;socket=path，-S path</p>
<p>用于连接的套接字文件。</p>
<p>·         &#8211;start-datetime=datetime</p>
<p>从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如：</p>
<p>shell&gt; mysqlbinlog &#8211;start-datetime=&#8221;2004-12-25 11:25:56&#8243; binlog.000003<br />
该选项可以帮助点对点恢复。</p>
<p>·         &#8211;stop-datetime=datetime</p>
<p>从二进制日志中第1个日期时间等于或晚于datetime参量的事件起停止读。关于datetime值的描述参见&#8211;start-datetime选项。该选项可以帮助及时恢复。</p>
<p>·         &#8211;start-position=N</p>
<p>从二进制日志中第1个位置等于N参量时的事件开始读。</p>
<p>·         &#8211;stop-position=N</p>
<p>从二进制日志中第1个位置等于和大于N参量时的事件起停止读。</p>
<p>·         &#8211;to-last-logs，-t</p>
<p>在MySQL服务器中请求的二进制日志的结尾处不停止，而是继续打印直到最后一个二进制日志的结尾。如果将输出发送给同一台MySQL服务器，会导致无限循环。该选项要求&#8211;read-from-remote-server。</p>
<p>·         &#8211;disable-logs-bin，-D</p>
<p>禁用二进制日志。如果使用&#8211;to-last-logs选项将输出发送给同一台MySQL服务器，可以避免无限循环。该选项在崩溃恢复时也很有用，可以避免复制已经记录的语句。注释：该选项要求有SUPER权限。</p>
<p>·         &#8211;user=user_name，-u user_name</p>
<p>连接远程服务器时使用的MySQL用户名。</p>
<p>·         &#8211;version，-V</p>
<p>显示版本信息并退出。</p>
<p>还可以使用&#8211;var_name=value选项设置下面的变量：</p>
<p>·         open_files_limit</p>
<p>指定要保留的打开的文件描述符的数量。</p>
<p>可以将mysqlbinlog的输出传到mysql客户端以执行包含在二进制日志中的语句。如果你有一个旧的备份，该选项在崩溃恢复时也很有用(参见5.9.1节，“数据库备份”)：</p>
<p>shell&gt; mysqlbinlog hostname-bin.000001 | mysql<br />
或：</p>
<p>shell&gt; mysqlbinlog hostname-bin.[0-9]* | mysql<br />
如果你需要先修改含语句的日志，还可以将mysqlbinlog的输出重新指向一个文本文件。(例如，想删除由于某种原因而不想执行的语句)。编辑好文件后，将它输入到mysql程序并执行它包含的语句。</p>
<p>mysqlbinlog有一个&#8211;position选项，只打印那些在二进制日志中的偏移量大于或等于某个给定位置的语句(给出的位置必须匹配一个事件的开始)。它还有在看见给定日期和时间的事件后停止或启动的选项。这样可以使用&#8211;stop-datetime选项进行点对点恢复(例如，能够说“将数据库前滚动到今天10:30 AM的位置”)。</p>
<p>如果MySQL服务器上有多个要执行的二进制日志，安全的方法是在一个连接中处理它们。下面是一个说明什么是不安全的例子：</p>
<p>shell&gt; mysqlbinlog hostname-bin.000001 | mysql # DANGER!!<br />
shell&gt; mysqlbinlog hostname-bin.000002 | mysql # DANGER!!<br />
使用与服务器的不同连接来处理二进制日志时，如果第1个日志文件包含一个CREATE TEMPORARY TABLE语句，第2个日志包含一个使用该临时表的语句，则会造成问题。当第1个mysql进程结束时，服务器撤销临时表。当第2个mysql进程想使用该表时，服务器报告 “不知道该表”。</p>
<p>要想避免此类问题，使用一个连接来执行想要处理的所有二进制日志中的内容。下面提供了一种方法：</p>
<p>shell&gt; mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql<br />
另一个方法是：</p>
<p>shell&gt; mysqlbinlog hostname-bin.000001 &gt;  /tmp/statements.sql<br />
shell&gt; mysqlbinlog hostname-bin.000002 &gt;&gt; /tmp/statements.sql<br />
shell&gt; mysql -e &#8220;source /tmp/statements.sql&#8221;<br />
mysqlbinlog产生的输出可以不需要原数据文件即可重新生成一个LOAD DATA INFILE操作。mysqlbinlog将数据复制到一个临时文件并写一个引用该文件的LOAD DATA LOCAL INFILE语句。由系统确定写入这些文件的目录的默认位置。要想显式指定一个目录，使用&#8211;local-load选项。</p>
<p>因为mysqlbinlog可以将LOAD DATA INFILE语句转换为LOAD DATA LOCAL INFILE语句(也就是说，它添加了LOCAL)，用于处理语句的客户端和服务器必须配置为允许LOCAL操作。参见5.6.4节，“LOAD DATA LOCAL安全问题”。</p>
<p>警告：为LOAD DATA LOCAL语句创建的临时文件不会自动删除，因为在实际执行完那些语句前需要它们。不再需要语句日志后应自己删除临时文件。文件位于临时文件目录中，文件名类似original_file_name-#-#。</p>
<p>&#8211;hexdump选项可以在注释中产生日志内容的十六进制转储：</p>
<p>shell&gt; mysqlbinlog &#8211;hexdump master-bin.000001<br />
上述命令的输出应类似：</p>
<p>/*!40019 SET @@session.max_insert_delayed_threads=0*/;<br />
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;<br />
# at 4<br />
#051024 17:24:13 server id 1  end_log_pos 98<br />
# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags<br />
# 00000004 9d fc 5c 43   0f   01 00 00 00   5e 00 00 00   62 00 00 00   00 00<br />
# 00000017 04 00 35 2e 30 2e 31 35  2d 64 65 62 75 67 2d 6c |..5.0.15.debug.l|<br />
# 00000027 6f 67 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |og&#8230;&#8230;&#8230;&#8230;..|<br />
# 00000037 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
# 00000047 00 00 00 00 9d fc 5c 43  13 38 0d 00 08 00 12 00 |&#8230;&#8230;.C.8&#8230;&#8230;|<br />
# 00000057 04 04 04 04 12 00 00 4b  00 04 1a                |&#8230;&#8230;.K&#8230;|<br />
#       Start: binlog v 4, server v 5.0.15-debug-log created 051024 17:24:13<br />
#       at startup<br />
ROLLBACK;<br />
十六进制转储的输出包含下面的元素：</p>
<p>·         Position: The byte position within the log file.</p>
<p>·         Timestamp: The event timestamp. In the example just shown, &#8217;9d fc 5c 43&#8242; is the representation of &#8217;051024 17:24:13&#8242; in hexadecimal.</p>
<p>·         Type: The type of the log event. &#8217;0f&#8217; means that the example event is a FORMAT_DESCRIPTION_EVENT. The types are:</p>
<p>·                00  UNKNOWN_EVENT<br />
·                    This event should never be present in the log.<br />
·                01  START_EVENT_V3<br />
·                    This indicates the start of a log file written by MySQL 4 or earlier.<br />
·                02  QUERY_EVENT<br />
·                    The most common type of events.  These contain queries executed<br />
·                    on the master.<br />
·                03  STOP_EVENT<br />
·                    Indicates that master has stopped.<br />
·                04  ROTATE_EVENT<br />
·                    Written when the master switches to a new log file.<br />
·                05  INTVAR_EVENT<br />
·                    Used mainly for AUTO_INCREMENT values and if the LAST_INSERT_ID()<br />
·                    function is used in the statement.<br />
·                06  LOAD_EVENT<br />
·                    Used for LOAD DATA INFILE in MySQL 3.23.<br />
·                07  SLAVE_EVENT<br />
·                    Reserved for future use.<br />
·                08  CREATE_FILE_EVENT<br />
·                    Used for LOAD DATA INFILE statements.  This indicates the start<br />
·                    of execution of such a statement.  A temporary file is created<br />
·                    on the slave.  Used in MySQL 4 only.<br />
·                09  APPEND_BLOCK_EVENT<br />
·                    Contains data for use in a LOAD DATA INFILE statement.  The<br />
·                    data is stored in the temporary file on the slave.<br />
·                0a  EXEC_LOAD_EVENT<br />
·                    Used for LOAD DATA INFILE statements.  The contents of the<br />
·                    temporary file is stored in the table on the slave.<br />
·                    Used in MySQL 4 only.<br />
·                0b  DELETE_FILE_EVENT<br />
·                    Rollback of LOAD DATA INFILE statement.  The temporary file<br />
·                    should be deleted on slave.<br />
·                0c  NEW_LOAD_EVENT<br />
·                    Used for LOAD DATA INFILE in MySQL 4 and earlier.<br />
·                0d  RAND_EVENT<br />
·                    Used to send information about random values if the RAND()<br />
·                    function is used in the query.<br />
·                0e  USER_VAR_EVENT<br />
·                    Used to replicate user variables.<br />
·                0f  FORMAT_DESCRIPTION_EVENT<br />
·                    This indicates the start of a log file written by MySQL 5 or later.<br />
·                10  XID_EVENT<br />
·                    Event indicating commit of XA transaction<br />
·                11  BEGIN_LOAD_QUERY_EVENT<br />
·                    Used for LOAD DATA statements in MySQL 5 and later.<br />
·                12  EXECUTE_LOAD_QUERY_EVENT<br />
·                    Used for LOAD DATA statements in MySQL 5 and later.<br />
·                13  TABLE_MAP_EVENT<br />
·                    Reserved for future use<br />
·                14  WRITE_ROWS_EVENT<br />
·                    Reserved for future use<br />
·                15  UPDATE_ROWS_EVENT<br />
·                    Reserved for future use<br />
·                16  DELETE_ROWS_EVENT<br />
·                    Reserved for future use<br />
·         Master ID: The server id of the master that created the event.</p>
<p>·         Size: The size in bytes of the event.</p>
<p>·         Master Pos: The position of the event in the original master log file.</p>
<p>·         Flags: 16 flags.</p>
<p>·                01  LOG_EVENT_BINLOG_IN_USE_F<br />
·                    Log file correctly closed (Used only in FORMAT_DESCRIPTION_EVENT)<br />
·                    If this flag is set (if the flags are e.g. &#8217;01 00&#8242;) in an<br />
·                    FORMAT_DESCRIPTION_EVENT, then the log file has not been<br />
·                    properly closed.  Most probably because of a master crash (for<br />
·                    example, due to power failure).<br />
·                02  Reserved for future use.<br />
·                04  LOG_EVENT_THREAD_SPECIFIC_F<br />
·                    Set if the event is dependent on the connection it was<br />
·                    executed in (example &#8217;04 00&#8242;), e.g. if the event uses<br />
·                    temporary tables.<br />
·                08  LOG_EVENT_SUPPRESS_USE_F<br />
·                    Set in some circumstances when the event is not dependent on<br />
·                    the current database<br />
其它标志保留用于将来使用。</p></blockquote>
<p>在以后的版本中十六进制转储输出的格式可能会改变。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4725/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Centos系统mysql相关命令</title>
		<link>http://blog.haohtml.com/index.php/archives/4701</link>
		<comments>http://blog.haohtml.com/index.php/archives/4701#comments</comments>
		<pubDate>Fri, 16 Jul 2010 07:01:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[js框架]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4701</guid>
		<description><![CDATA[Centos系统mysql 忘记root用户的密码： 第一步：(停掉正在运行的mysql) [root@CentOs5 ~]# service mysqld stop Stopping MySQL: [ OK ] 第二步：使用 “&#8211;skip-grant-tables”参数重新启动mysql [root@CentOs5 ~]# mysqld_safe &#8211;skip-grant-tables &#38; [1] 23810 [root@CentOs5 ~]# Starting mysqld daemon with databases from /var/lib/mysql 第三步：用帐号登录mysql [root@CentOs5 ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste"><strong>Centos系统mysql 忘记root用户的密码：</strong></div>
<div id="_mcePaste">第一步：(停掉正在运行的mysql)</div>
<div id="_mcePaste">[root@CentOs5 ~]# service mysqld stop</div>
<div id="_mcePaste">Stopping MySQL: [ OK ]</div>
<div id="_mcePaste">第二步：使用 “&#8211;skip-grant-tables”参数重新启动mysql</div>
<div id="_mcePaste">[root@CentOs5 ~]# mysqld_safe &#8211;skip-grant-tables &amp;</div>
<div id="_mcePaste">[1] 23810</div>
<div id="_mcePaste">[root@CentOs5 ~]# Starting mysqld daemon with databases from /var/lib/mysql<br />
<span id="more-4701"></span></div>
<div id="_mcePaste">第三步：用帐号登录mysql</div>
<div id="_mcePaste">[root@CentOs5 ~]# mysql -u root</div>
<div id="_mcePaste">Welcome to the MySQL monitor. Commands end with ; or \g.</div>
<div id="_mcePaste">Your MySQL connection id is 1</div>
<div id="_mcePaste">Server version: 5.0.77 Source distribution</div>
<div id="_mcePaste">Type &#8216;help;&#8217; or &#8216;\h&#8217; for help. Type &#8216;\c&#8217; to clear the buffer.</div>
<div id="_mcePaste">第四步：改变用户数据库</div>
<div id="_mcePaste">mysql&gt; use mysql</div>
<div id="_mcePaste">Reading table information for completion of table and column names</div>
<div id="_mcePaste">You can turn off this feature to get a quicker startup with -A</div>
<div id="_mcePaste">Database changed</div>
<div id="_mcePaste">第五步：修改密码，记得密码要用password()函数进行加密，一定不要忘记！！！</div>
<div id="_mcePaste">mysql&gt; update user set password=password(&#8216;admin123&#8242;) where user=&#8217;root&#8217;;</div>
<div id="_mcePaste">Query OK, 1 row affected (0.04 sec)</div>
<div id="_mcePaste">Rows matched: 1 Changed: 1 Warnings: 0</div>
<div id="_mcePaste">第六步：刷新权限表</div>
<div id="_mcePaste">mysql&gt; flush previleges;</div>
<div id="_mcePaste">ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#8216;previleges&#8217; at line 1</div>
<div id="_mcePaste">mysql&gt; flush privileges;</div>
<div id="_mcePaste">Query OK, 0 rows affected (0.00 sec)</div>
<div id="_mcePaste">第七步：退出mysql</div>
<div id="_mcePaste">mysql&gt; quit</div>
<div id="_mcePaste">Bye</div>
<div id="_mcePaste">
第八步：对mysql进行重启</div>
<div id="_mcePaste">[root@CentOs5 ~]# service mysqld restart;</div>
<div id="_mcePaste">STOPPING server from pid file /var/run/mysqld/mysqld.pid</div>
<div id="_mcePaste">100421 13:44:03 mysqld ended</div>
<div id="_mcePaste">Stopping MySQL: [ OK ]</div>
<div id="_mcePaste">Starting MySQL: [ OK ]</div>
<div id="_mcePaste">[1]+ Done mysqld_safe &#8211;skip-grant-tables</div>
<div id="_mcePaste">
第九步：用更改过的密码重新登录即可。</div>
<div id="_mcePaste">[root@CentOs5 ~]# mysql -u root -p</div>
<div id="_mcePaste">Enter password: admin123</div>
<div id="_mcePaste">Welcome to the MySQL monitor. Commands end with ; or \g.</div>
<div id="_mcePaste">Your MySQL connection id is 2</div>
<div id="_mcePaste">Server version: 5.0.77 Source distribution</div>
<div id="_mcePaste">Type &#8216;help;&#8217; or &#8216;\h&#8217; for help. Type &#8216;\c&#8217; to clear the buffer.</div>
<div id="_mcePaste">mysql&gt; quit</div>
<div id="_mcePaste">Bye</div>
<div id="_mcePaste">[root@CentOs5 ~]#</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4701/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>发现瓶颈 &#8211; Profiling(程序剖析) -MySQL Profiling</title>
		<link>http://blog.haohtml.com/index.php/archives/4624</link>
		<comments>http://blog.haohtml.com/index.php/archives/4624#comments</comments>
		<pubDate>Tue, 13 Jul 2010 09:00:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[查询优化]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4624</guid>
		<description><![CDATA[MySQL程序剖析 （Profiling） 我们将要详细的讲到MySQL的剖析(Profiling),因为它很少依赖于你的应用。应用和服务器 级别的剖析有的时候都是有必要的。虽然应用级别的剖析可以给你整个应用性能的总揽。，但是对MySQL的剖析提供了信息是服务器级别所提供不了的。比如， 对PHP代码进行剖析不会显示MySQL有多少行语句执行了。 与应用剖析一样，目标是找出MySQL哪部分消耗过多的时间。我们不会剖析MySQL源码的，虽然有的 时候定制化MySQL安装很有用，但是这是另一本书的主题了。所替代的是，我们将教你一些可以技术来获取和分析不同种类的MySQL执行语句的信息。 你可以用在任意的颗粒级别以满足你的需求：你可能对整个服务器进行剖析或者单独检查一个语句或者一组语 句。下列信息你可以一点点的收集： MySQL经常访问的那些数据 MySQL经常执行语句的类型 MySQL线程大部分时间的状态 MySQL经常执行语句的子系统 MySQL执行语句所访问的数据类型 不同活动的类型，比如扫描索引。 我们先从范围最广的剖析开始，那就是服务器剖析，将教你更多细节。 记录执行的语句 MySQL有两种记录语句的类型：general log和slow log。他们都是记录执行语句，但是却在语句执行进程的两端。general log记录了每个服务器收到的语句，因此它的语句可能包含了那些没有执行导致错误的语句。general Log记录了所有的语句，包括了一些非执行语句的事件，比如连接和断开连接。你可以用一个指令来启用它。 log = &#60;file_name&#62; 根据设计，general log不会包括执行时间和其他一些仅仅在语句执行完毕的信息。相比较而言，slow log记录执行完毕的语句。尤其是，它记录那些超过指定时间执行的语句。这两种日志都对程序剖析很有用，但是slow log是获取问题语句的主要工具。我们常常推荐把它开启。 下面列出的配置会开启这个日志。获取所有执行时间超过2s的语句，以及记录那些不使用索引的语句。它也 会记录一些执行慢的管理语句，比如OPTIMIZE TABLE: log-slow-queries  = &#60;file_name&#62; long_query_time  = 2 log-queries-not-using-indexes log-slow-admin-statements 你可以自定义这些配置，然后把它们放到my.conf文件中。更多的服务器配置将在以后的章节详细讲 述。 long_query_time的默认值是10s。这个设置太慢了，因此我们一般都设置它为2s。然 而，对于许多应用，可能1s都非常慢了。我们在下一部分将讲述如何获得颗粒度更细的日志。 在MySQL5.1中，提供了运行时调整 slow_query_log，slow_query_log_file参数来控制slow log.但是在MySQL5.0中，在不启动MySQL的情况下，不能开闭slow log。对于MySQL5.0的变通方法是，可以动态的修改long_query_time变量。下面的语句虽然不是真正开启slow log的方式，但是取得了同样的效果。（如果有语句执行超过了10000s，那么你需要优化了这些语句了） mysql&#62; SET GLOBAL long_query_time = 10000; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>MySQL程序剖析 （Profiling）</strong></p>
<p>我们将要详细的讲到MySQL的剖析(Profiling),因为它很少依赖于你的应用。应用和服务器 级别的剖析有的时候都是有必要的。虽然应用级别的剖析可以给你整个应用性能的总揽。，但是对MySQL的剖析提供了信息是服务器级别所提供不了的。比如， 对PHP代码进行剖析不会显示MySQL有多少行语句执行了。</p>
<p>与应用剖析一样，目标是找出MySQL哪部分消耗过多的时间。我们不会剖析MySQL源码的，虽然有的 时候定制化MySQL安装很有用，但是这是另一本书的主题了。所替代的是，我们将教你一些可以技术来获取和分析不同种类的MySQL执行语句的信息。<span id="more-4624"></span></p>
<p>你可以用在任意的颗粒级别以满足你的需求：你可能对整个服务器进行剖析或者单独检查一个语句或者一组语 句。下列信息你可以一点点的收集：</p>
<ul>
<li>MySQL经常访问的那些数据</li>
<li>MySQL经常执行语句的类型</li>
<li>MySQL线程大部分时间的状态</li>
<li>MySQL经常执行语句的子系统</li>
<li>MySQL执行语句所访问的数据类型</li>
<li>不同活动的类型，比如扫描索引。</li>
</ul>
<div>我们先从范围最广的剖析开始，那就是服务器剖析，将教你更多细节。</div>
<h3>记录执行的语句</h3>
<p>MySQL有两种记录语句的类型：general log和slow  log。他们都是记录执行语句，但是却在语句执行进程的两端。general  log记录了每个服务器收到的语句，因此它的语句可能包含了那些没有执行导致错误的语句。general  Log记录了所有的语句，包括了一些非执行语句的事件，比如连接和断开连接。你可以用一个指令来启用它。</p>
<p>log = &lt;file_name&gt;</p>
<p>根据设计，general  log不会包括执行时间和其他一些仅仅在语句执行完毕的信息。相比较而言，slow  log记录执行完毕的语句。尤其是，它记录那些超过指定时间执行的语句。这两种日志都对程序剖析很有用，但是slow  log是获取问题语句的主要工具。我们常常推荐把它开启。</p>
<p>下面列出的配置会开启这个日志。获取所有执行时间超过2s的语句，以及记录那些不使用索引的语句。它也 会记录一些执行慢的管理语句，比如OPTIMIZE TABLE:</p>
<p>log-slow-queries  =  &lt;file_name&gt;</p>
<p>long_query_time  = 2</p>
<p>log-queries-not-using-indexes</p>
<p>log-slow-admin-statements</p>
<p>你可以自定义这些配置，然后把它们放到my.conf文件中。更多的服务器配置将在以后的章节详细讲 述。</p>
<p>long_query_time的默认值是10s。这个设置太慢了，因此我们一般都设置它为2s。然 而，对于许多应用，可能1s都非常慢了。我们在下一部分将讲述如何获得颗粒度更细的日志。</p>
<p>在MySQL5.1中，提供了运行时调整 slow_query_log，slow_query_log_file参数来控制slow  log.但是在MySQL5.0中，在不启动MySQL的情况下，不能开闭slow  log。对于MySQL5.0的变通方法是，可以动态的修改long_query_time变量。下面的语句虽然不是真正开启slow  log的方式，但是取得了同样的效果。（如果有语句执行超过了10000s，那么你需要优化了这些语句了）</p>
<p>mysql&gt; SET GLOBAL long_query_time = 10000;</p>
<p>相关配置变量，log_queries_not_using_indexes  使服务器记录没有使用索引的语句。而不管它们的执行时间。虽然开启了slow  log会增加一些时间的消耗，导致语句执行速度减慢，但是没有使用索引的语句还是可以经常和非常快速的执行。（比如一些查询一些数据量小的表）这样会使降 低服务器的速度，以及使用大量的硬盘空间保存日志。</p>
<p>不幸的是，在MySQL5.0中不能动态的开启或关闭日志。你必须修改MySQL配置文件，然后重启 MySQL。当你想关闭日志而不想重启服务器，可以把日志文件做一个/dev/null的指向。在确定了MySQL关闭了日志文件描述以及在/dev /null重新打开它，那么你仅执行FLUSH LOGS就可以了。</p>
<p>相比较而言，MySQL5.1能实时更改日志以及能把日志记录到表中。这是个很大的进步了。</p>
<p><strong>细颗粒度的日志</strong></p>
<p>MySQL5.0以及更早的版本的slow log  都有一定的限制，在一些用途下就没用了。最首要的问题就是它的颗粒度仅仅是秒。以及long_query_time在MySQL5.0中最小单位就是 1s。大部分交互的应用中，这个时间就比较长了。如果你正在开发一个高性能的WEB应用，你可能希望整个页面生成小于1s.以及在开始生成的过程中记录许 多语句。这种情况下，一个语句执行了150ms，也会被认为是个很慢的语句。</p>
<p>另一个问题是，并不是所有的执行语句都记录在slow  log中（尤其是，子节点的线程语句不能被记录）。general  log记录了所有的语句，但是是在这些语句解析之前记录的，只要就不能记录一些如执行时间，锁时间，以及执行的行数的记录了。只有slow  log包含这些信息。</p>
<p>最终，如果你开启了log_queries_not_using_indexes参数。可能slow  log就被大量的实体，高效的语句所填满。比如，如果你过你生成一个下拉菜单的数据，你可能执行SELECT * FROM  STATES。这个语句就被记录了，因为它是整张表的扫描。</p>
<p>当程序剖析的目标是性能优化，你应该查看让MySQL服务器大量工作的语句。这并不是意味着总是执行慢 的语句。所以记录执行慢的语句可能也没什么用处了。一个例子，一个10ms的语句在一秒内执行了1000次对服务器的压力高于10s语句每秒运行一次。为 了发现这个问题，你必须记录每条语句和分析结果。</p>
<p>一起查看执行慢的语句和导致服务器压力过大的语句执行总量是非常有用的方法。这会让你发现不同的问题。 如一个语句导致了很差的用户体验。</p>
<p>我们已经开发了一个MySQL的补丁。基于Georg  Richter工作之上而开发的。让你指定slow  log语句时间到毫秒级别，而不是原来的秒。通过设置long_query_time=0，它也能让你记录所有的语句。这个补丁的地址是 http://www.mysqlperformanceblog.com/mysql-patches/。它的主要缺点就是你需要自己编译MySQL。 因为这个补丁在MySQL5.1之前并没有包含在MySQL发行包中。</p>
<p>目前，MySQL5.1包含了这个补丁，但仅能修改时间的颗粒度。这个补丁的新版本，将不会包含在 MySQL的发行包中。新版本将添加一些有用的功能。这些功能包含了语句执行的连接ID，也包含了语句执行的缓存，连接类型，临时表，以及排序。也添加了 InnoDB的统计，比如I/O行为以及锁等待。</p>
<p>新版本的补丁可以记录子节点所执行的语句。如果在子节点复制的过程中出现问题，这个功能就尤其有用。它 也能让你选择一些会话的日志。这些功能对程序剖析来说已经足够了，我们认为这就是最佳实践了。</p>
<p>这个补丁是比较新的，因此如果你要应用，要小心的使用它。我们想它已经很安全了，但是它在其他的 MySQL服务器还没有经过足够的考验。如果你担心这个还有补丁的MySQL服务器的稳定性，你不一定要一直运行它，你可以先运行它几个小时记录一些语 句，然后在恢复你自己的MySQL版本。</p>
<p>当程序剖析的时候，把参数long_query_time=0记录所有语句是个很好的方法。如果大部分 的读取来自于非常简单的语句，你可能想知道这些情况。记录所有语句会影响一些性能以及它要求更多的硬盘空间-这就是另一个不需要记录所有语句的理由。幸运 的是，你可以随时修改long_query_time而不用去重新启动服务器。因此很容易在一段时间内获取所有语句。然后在恢复记录那些执行比较慢的语 句。</p>
<h3>怎样读取slow log</h3>
<p>这是一个slow log的例子</p>
<p>1 # Time: 030303 0:51:27</p>
<p>2 # User@Host: root[root] @ localhost []</p>
<p>3 # Query_time: 25 Lock_time: 0 Rows_sent: 3949  Rows_examined: 378036</p>
<p>4 SELECT &#8230;</p>
<p>第一行显示了日志记录的时间，第二行显示谁执行了这些语句。第三行显示这语句执行的时间，在MySQL 服务器级别等待表锁的时间，执行语句返回的行数，以及语句检索的行数。这些语句都是被注视掉的。因此如果你把日志提供给MySQL  Client,他们也不会执行。最后一行就是执行的语句。</p>
<p>这个例子是MySQL5.1版本的</p>
<p>1 # Time: 070518 9:47:00</p>
<p>2 # User@Host: root[root] @ localhost []</p>
<p>3 # Query_time: 0.000652 Lock_time: 0.000109  Rows_sent: 1 Rows_examined: 1</p>
<p>4 SELECT &#8230;</p>
<p>和上个日志基本相同，除了第三行，精度变得更高了。上一部分我们提到的补丁提供了更全面的信息</p>
<p>1 # Time: 071031 20:03:16</p>
<p>2 # User@Host: root[root] @ localhost []</p>
<p>3 # Thread_id: 4</p>
<p>4 # Query_time: 0.503016 Lock_time: 0.000048  Rows_sent: 56 Rows_examined: 1113</p>
<p>5 # QC_Hit: No Full_scan: No Full_join: No  Tmp_table: Yes Disk_tmp_table: No</p>
<p>6 # Filesort: Yes Disk_filesort: No  Merge_passes: 0</p>
<p>7 # InnoDB_IO_r_ops: 19 InnoDB_IO_r_bytes:  311296 InnoDB_IO_r_wait: 0.382176</p>
<p>8 # InnoDB_rec_lock_wait: 0.000000  InnoDB_queue_wait: 0.067538</p>
<p>9 # InnoDB_pages_distinct: 20</p>
<p>10 SELECT &#8230;</p>
<p>第五行显示了这个语句是否使用了缓存，是否检索了整张表，是否没有用索引进行表连接，是否是否临时表， 以及临时表是否创建在硬盘上。第六行给出了是否进行了文件排序以及，如果是，是否保存到硬盘上以及有多少合并排序通过它执行的。</p>
<p>如果语句执行在InnoDB上，第7，8，9行就会显示。第7行显示了在执行语句的时候，InnoDB 计划读取的页数，与它一起的是byte数值。第7行最后的一个值是InnoDB从硬盘读取数据的时间。第8行显示了语句等待行锁以及用了多少时间等待进入 InnoDB内核。</p>
<p>第9行显示了语句访问唯一InnoDB大约的页面数。这个数值越大，准确度貌似就越低了。这个信息的一 种用处就是估计在页面中语句的工作集。这个就是InnoDB缓冲池缓存数据的方式。它也能显示你的集群索引是非常的有用。如果这个语句的行很好的集群索引 了，它们会填充更少的页面。以后会讲到集群索引。</p>
<p>使用slow  log去解决慢语句并不总是很简单。虽然log包含了很多有用的信息，但是一个非常重要的信息却丢失了：那就是语句执行为什么会这么慢的一个想法。有的时 候，这是显而易见的。如果log得出了12，000，000行被检查以及1，200，000被发送到了客户端，你知道为什么这么慢的原因了&#8211;这是个很大 的执行语句。然而，这是很难的的清晰。</p>
<p>要注意的是，不要给slow  log添加过多的含义。如果你看到一条语句在log中出现多次，那就发现了这语句很慢以及需要优化。但是仅仅因为一个语句在log出现的频率并不意味着它 是个糟糕的语句或者甚至并不是缓慢的。你可能找到了一个很慢的语句，运行它，以及发现它执行的时间只是一眨眼的时间。出现在日志中只能说明在过去的那个时 候这个语句执行时间很长，并不意味着现在或以后它会执行很长时间。一个语句有的时候很慢，在另外的时间却很快，这种情况原因是很多的：</p>
<ul>
<li>一个表可能被锁定了，导致了语句必须去等待。Lock_time指明了这个语句等待锁释放的时间。</li>
<li>数据或者索引没有被缓存。在MySQL刚启动的时候或还没有调整好的情况下，这种问题很常见。</li>
<li>可能是备份正在执行，导致了硬盘I/O很慢。</li>
<li>这个服务器同时还运行着其他语句，导致了这个语句很慢。</li>
</ul>
<div>因此，你查看slow log应该把它作为部分数据来看。你可以使用它创建一个可疑语句的列表，但是你需要更深层次的分析每一项。</div>
<div>slow  log补丁的出现帮助你理解为什么语句执行会很慢。尤其在你使用InnoDB的时候，InnoDB统计信息能带给我们更多的信息：你可以查看语句执行是否 在等待硬盘的I/O，InnoDB队列中它是否在花费大量的时间去等待，以及等等其他的信息。</div>
<h3>日志分析工具</h3>
<p>现在你已经记录了一些执行的语句了。是时候分析结果了。一般的策略是找出对服务器影响最大的语句，用 Explain检查它们执行计划进行必要的调整。在调整之后不断地重复这个过程。因为你的修改可能会影响其他语句的执行。比较常见的就是索引可以提高 SELECT的速度但是会降低INSERT或UPDATE语句。</p>
<p>一般来说你应该在日志中查找如下的执行语句：</p>
<ol>
<li>Long queries(运行时间长的语句)：固定时间的批量任务使语句执行缓慢，但是正常的语句不应该执行的很慢。</li>
<li>High-impact  queries(影响大的语句)：找出那些占用服务器执行大部分时间的语句。还记得上一部分说过的执行时间短的语句占用了很多时间。</li>
<li>new  queries(新出现的语句)：找出那些昨天还没有在前100个，但是今天却出现的语句。这些语句可能是新出现的也可能是被很快的运行以及正在变得糟 糕。可能因为不同的索引或者其他别的什么改变。</li>
</ol>
<div>如果的slow  log记录的数据很少，那么可以去手工去处理，但是你如果记录了所有的执行语句（这是我们所推荐的），那么你就需要一个工具去帮助你了。下列的工具你能用 的上。</div>
<h3>mysqldumpslow：</h3>
<div>这是MySQL本身提供的mysqldumpslow。这个是个Perl脚本能总结slow  log以及每个执行语句在log中出现的次数。有这个方法你就不会浪费时间优化一个一天，才执行一次的30s慢语句。而去优化那些看起来很快的语句，但是 每天却执行了上千次。mysqldumpslow的优势是它是默认安装的，缺点是相对于其他工具灵活性不足。它的文档也不是很全，以及它也不能分析我们以 前介绍过得那个low log补丁生成的log。</div>
<h3>mysql_slow_log_filter：</h3>
<div>下载地址http://www.mysqlperformanceblog.com/files/utils /mysql_slow_log_filter，这个工具可以解析精确度为ms的log.你可以提取那些执行时间高于指定时间的语句或者检查给定的行数。 这个工具是对slow log补丁的很好补充。你可以设置一个高的临界值去优化语句，直到这个语句效率提高。然后在改变参数获得更多的执行语句继续调整。</div>
<div>以下命令的意思就是，显示那些执行超过0.5s以及检查超过1000行的语句。</div>
<div>$ tail -f mysql-slow.log | mysql_slow_log_filter -T 0.5 -R 1000</div>
<div><strong>mysql_slow_log_parser：</strong></div>
<div>这是另一个工具，地址为：http://www.mysqlperformanceblog.com/files/utils /mysql_slow_log_parser，这款工具可以聚合slow  log信息。除了聚合和报表，它也显示了执行时间和分析的行数的最大和最小值。打印一个“标准化”的执行语句，以及打印一个你可以EXPAIN的语句。下 面是个简单输出</div>
<div>
<div>### 3579 Queries</div>
<div>### Total time: 3.348823, Average time: 0.000935686784017883</div>
<div>### Taking 0.000269  to 0.130820  seconds to complete</div>
<div>### Rows analyzed 1 &#8211; 1</div>
<div>SELECT id FROM forum WHERE id=XXX;</div>
<div>SELECT id FROM forum WHERE id=12345;</div>
</div>
<div><strong>mysqlsla：</strong></div>
<div>MySQL Statement Log Analyzer.地址如下：http://hackmysql.com/</div>
<div>它不仅仅能分析slow log也能分析general log和&#8221;raw&#8221;  log（这个log是把SQL语句用分隔符分开的log）.想mysql_slow_log_parser一样。它能标准化和进行汇总。它也能 EXPLAIN语句（它对许多非查询语句进行了重写）以及生成复杂的报表。</div>
<div>你可以使用slow  log的统计信息去预测下你将会降低多少服务器系统资源的消耗。假设你抽样执行语句1个小时。发现总和的语句执行时间是10000s（总的时间是超过时钟 时间的，因为语句执行是并行的）。如果日志分析一个最差的语句执行了3000s，你会知道它占了整个读取的30%。现在你就知道通过优化这个语句你可以降 低服务器多少资源消耗了。</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4624/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>查看mysql索引使用情况</title>
		<link>http://blog.haohtml.com/index.php/archives/4616</link>
		<comments>http://blog.haohtml.com/index.php/archives/4616#comments</comments>
		<pubDate>Tue, 13 Jul 2010 07:52:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[索引]]></category>
		<category><![CDATA[查询优化]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4616</guid>
		<description><![CDATA[查看索引使用情况 如果索引正在工作， Handler_read_key 的值将很高，这个值代表了一个行被索引值读的次数，很低的值表明增加索引得到的性能改善不高，因为索引并不经常使用。 Handler_read_rnd_next 的值高则意味着查询运行低效，并且应该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果你正进行大量的表扫描，该值较高。通常说明表索引不正确或写入的查询没有利用索引。 语法： mysql&#62; show status like &#8216;Handler_read%&#8217;;]]></description>
			<content:encoded><![CDATA[<p>查看索引使用情况</p>
<p>如果索引正在工作， Handler_read_key 的值将很高，这个值代表了一个行被索引值读的次数，很低的值表明增加索引得到的性能改善不高，因为索引并不经常使用。</p>
<p>Handler_read_rnd_next 的值高则意味着查询运行低效，并且应该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果你正进行大量的表扫描，该值较高。通常说明表索引不正确或写入的查询没有利用索引。</p>
<p>语法：</p>
<blockquote><p>mysql&gt; show status like &#8216;Handler_read%&#8217;;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4616/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql中使用source命令恢复sql备份文件时出现的问题</title>
		<link>http://blog.haohtml.com/index.php/archives/4609</link>
		<comments>http://blog.haohtml.com/index.php/archives/4609#comments</comments>
		<pubDate>Tue, 13 Jul 2010 05:00:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4609</guid>
		<description><![CDATA[当使用mysql做数据库还原的时候，由于有些数据很大，总是失败并决 MySQL server has gone away之类的信息，并自动重新连接数据库且自动继续执行恢复操作，此时没有办法重新指定字符集，容易出现乱码，导致数据库恢复失败，只需要修改max_allowed_packet 参数的值即可. mysql根据配置文件会限制server接受的数据包大小。 有时候大的插入和更新会被max_allowed_packet 参数限制掉，导致失败。 1） 方法1 可以编辑my.cnf来修改（windows下my.ini）,在[mysqld]段或者mysql的server配置段进行修改。 max_allowed_packet = 20M 如果找不到my.cnf可以通过 mysql --help &#124; grep my.cnf 去寻找my.cnf文件。 2） 方法2 （很妥协，很纠结的办法） 进入mysql server mysql -h 主机 -u 账号 -p密码 set global max_allowed_packet = 2*1024*1024*10 然后关闭掉这此mysql server链接，再进入。 show variables like 'max_%' 查看下max_allowed_packet是否编辑成功。]]></description>
			<content:encoded><![CDATA[<p>当使用mysql做数据库还原的时候，由于有些数据很大，总是失败并决 MySQL server has gone away之类的信息，并自动重新连接数据库且自动继续执行恢复操作，此时没有办法重新指定字符集，容易出现乱码，导致数据库恢复失败，只需要修改max_allowed_packet 参数的值即可.</p>
<div>
<div>
<p>mysql根据配置文件会限制server接受的数据包大小。</p>
<p>有时候大的插入和更新会被max_allowed_packet 参数限制掉，导致失败。</p>
<h2>1） 方法1</h2>
<p>可以编辑my.cnf来修改（windows下my.ini）,在[mysqld]段或者mysql的server配置段进行修改。</p>
<div>
<div>
<pre>max_allowed_packet = 20M</pre>
</div>
</div>
<p>如果找不到my.cnf可以通过</p>
<div>
<div>
<pre>mysql --help | grep my.cnf</pre>
</div>
</div>
<p>去寻找my.cnf文件。</p>
<h2>2） 方法2</h2>
<p><strong>（很妥协，很纠结的办法）</strong></p>
<p>进入mysql server</p>
<div>
<div>
<pre>mysql -h 主机 -u 账号 -p密码
set global max_allowed_packet = 2*1024*1024*10</pre>
</div>
</div>
<p>然后关闭掉这此mysql server链接，再进入。</p>
<div>
<div>
<pre>show variables like 'max_%'</pre>
</div>
</div>
<p>查看下max_allowed_packet是否编辑成功。</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4609/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入Mysql字符集设置</title>
		<link>http://blog.haohtml.com/index.php/archives/4606</link>
		<comments>http://blog.haohtml.com/index.php/archives/4606#comments</comments>
		<pubDate>Tue, 13 Jul 2010 04:46:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4606</guid>
		<description><![CDATA[基本概念 • 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等； • 给定一系列字符，对每个字符赋予一个数值，用数值来代表对应的字符，这一数值就是字符的编码(Encoding)。例如，我们给字符’A’赋予数值0，给 字符’B’赋予数值1，则0就是字符’A’的编码； • 给定一系列字符并赋予对应的编码后，所有这些字符和编码对组成的集合就是字符集(Character Set)。例如，给定字符列表为{’A’,’B’}时，{’A’=&#62;0, ‘B’=&#62;1}就是一个字符集； • 字符序(Collation)是指在同一字符集内字符之间的比较规则； • 确定字符序后，才能在一个字符集上定义什么是等价的字符，以及字符之间的大小关系； • 每个字符序唯一对应一种字符集，但一个字符集可以对应多种字符序，其中有一个是默认字符序(Default Collation)； • MySQL中的字符序名称遵从命名惯例：以字符序对应的字符集名称开头；以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码 值比较)结尾。例如：在字符序“utf8_general_ci”下，字符“a”和“A”是等价的； MySQL字符集设置 • 系统变量： – character_set_server：默认的内部操作字符集 – character_set_client：客户端来源数据使用的字符集 – character_set_connection：连接层字符集 – character_set_results：查询结果字符集 – character_set_database：当前选中数据库的默认字符集 – character_set_system：系统元数据(字段名等)字符集 – 还有以collation_开头的同上面对应的变量，用来描述字符序。 • 用introducer指定文本字符串的字符集： – 格式为：[_charset] ’string’ [COLLATE collation] – 例如： • SELECT _latin1 ’string’; • SELECT _utf8 ‘你好’ COLLATE [...]]]></description>
			<content:encoded><![CDATA[<div id="blog_text">
<h4><strong>基本概念</strong></h4>
<p>• 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等；</p>
<p>•  给定一系列字符，对每个字符赋予一个数值，用数值来代表对应的字符，这一数值就是字符的编码(Encoding)。例如，我们给字符’A’赋予数值0，给 字符’B’赋予数值1，则0就是字符’A’的编码；</p>
<p>• 给定一系列字符并赋予对应的编码后，所有这些字符和编码对组成的集合就是字符集(Character  Set)。例如，给定字符列表为{’A’,’B’}时，{’A’=&gt;0, ‘B’=&gt;1}就是一个字符集；</p>
<p>• 字符序(Collation)是指在同一字符集内字符之间的比较规则；</p>
<p>• 确定字符序后，才能在一个字符集上定义什么是等价的字符，以及字符之间的大小关系；</p>
<p>• 每个字符序唯一对应一种字符集，但一个字符集可以对应多种字符序，其中有一个是默认字符序(Default Collation)；</p>
<p>•  MySQL中的字符序名称遵从命名惯例：以字符序对应的字符集名称开头；以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码 值比较)结尾。例如：在字符序“utf8_general_ci”下，字符“a”和“A”是等价的； <span id="more-4606"></span><strong>MySQL字符集设置</strong></p>
<p>• 系统变量：</p>
<p>– <strong>character_set_server</strong>：默认的内部操作字符集</p>
<p>– <strong>character_set_client</strong>：客户端来源数据使用的字符集</p>
<p>– <strong>character_set_connection</strong>：连接层字符集</p>
<p>– <strong>character_set_results</strong>：查询结果字符集</p>
<p>– <strong>character_set_database</strong>：当前选中数据库的默认字符集</p>
<p>– <strong>character_set_system</strong>：系统元数据(字段名等)字符集</p>
<p>– 还有以<strong>collation_</strong>开头的同上面对应的变量，用来描述字符序。</p>
<p>• 用introducer指定文本字符串的字符集：</p>
<p>– 格式为：[_charset] ’string’ [COLLATE collation]</p>
<p>– 例如：</p>
<p>• SELECT _latin1 ’string’;</p>
<p>• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;</p>
<p>– 由introducer修饰的文本字符串在请求过程中不经过多余的转码，直接转换为内部字符集处理。</p>
<h4><strong>MySQL中的字符集转换过程</strong></h4>
<p>1. MySQL  Server收到请求时将请求数据从character_set_client转换为character_set_connection；</p>
<p>2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集，其确定方法如下：</p>
<p>• 使用每个数据字段的CHARACTER SET设定值；</p>
<p>• 若上述值不存在，则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展，非SQL标准)；</p>
<p>• 若上述值不存在，则使用对应数据库的DEFAULT CHARACTER SET设定值；</p>
<p>• 若上述值不存在，则使用character_set_server设定值。</p>
<p>3. 将操作结果从内部操作字符集转换为character_set_results。</p>
<p><a href="http://by1.storage.msn.com/y1pe_jYelFdqS5ZJBldNnN9gSgYvu_yPc2SPiYr0F0bF7hv5mC9eAa4eB1O_GcmQX4LuVf7yiUB9a4WppnLOMJURShP4yYRLXXr?PARTNER=WRITER"><img src="http://by1.storage.msn.com/y1pe_jYelFdqS4M9uVHASUOPMiWGlORakiVALpmSBiPqEK3tIk0pus8_MDYpf2ILdCT9o1jW0SU9cv5aDsszqDz1rmEP6crey3P?PARTNER=WRITER" border="0" alt="图片1" width="426" height="373" /></a></p>
<h4><strong>常见问题解析</strong></h4>
<p>• 向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集，查询时设置连接字符集为utf8</p>
<p>–  插入时根据MySQL服务器的默认设置，character_set_client、character_set_connection和 character_set_results均为latin1；</p>
<p>–  插入操作的数据将经过latin1=&gt;latin1=&gt;utf8的字符集转换过程，这一过程中每个插入的汉字都会从原始的3个字节变成6个字 节保存；</p>
<p>– 查询时的结果将经过utf8=&gt;utf8的字符集转换过程，将保存的6个字节原封不动返回，产生乱码……</p>
<p><a href="http://ixxpjg.bay.livefilestore.com/y1pU6_cSvL4HBsiKr55ChShxx15zfX64SQiUj_czboWqPod1v6K0Wb-LebCyQC1tSi7E9AH1qnY8ACb8E9STxpB268dg3ZYaHFy?PARTNER=WRITER"><img src="http://by1.storage.msn.com/y1pe_jYelFdqS65OW_dplyOcCLGOp_5HSQ2yXdkDqtt3VNeuqllpNEkzOzQsKv2mpa71xcdFHmJjZ4Nte_6LGpf7zhgoeoIUoO8?PARTNER=WRITER" border="0" alt="图片2" width="553" height="236" /></a></p>
<p>• 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8</p>
<p>–  插入时根据连接字符集设置，character_set_client、character_set_connection和 character_set_results均为utf8；</p>
<p>–  插入数据将经过utf8=&gt;utf8=&gt;latin1的字符集转换，若原始数据中含有\u0000~\u00ff范围以外的Unicode字  符，会因为无法在latin1字符集中表示而被转换为“?”(0×3F)符号，以后查询时不管连接字符集设置如何都无法恢复其内容了。</p>
<p><a href="http://ixxpjg.bay.livefilestore.com/y1pU6_cSvL4HBsnogZw0HevAR0xadYeRuYNzavtKLG29pZqXskdoxoXjOVZ3rZcYUyu74ISQqNaW2kPQ5ZKj6cc2cIudvq5Y2hF?PARTNER=WRITER"><img src="http://by1.storage.msn.com/y1pe_jYelFdqS4EkLLX7fHY9BjVxN1dxUWGpFTyfv_Lk8CdCifQ1ZXIPOGfhFV2emYq46cOYM004D1ft_-dDLfvgEicuIhhGFRB?PARTNER=WRITER" border="0" alt="图片3" width="559" height="246" /></a></p>
<h4><strong>检测字符集问题的一些手段</strong></h4>
<p>• SHOW CHARACTER SET;</p>
<p>• SHOW COLLATION;</p>
<p>• SHOW VARIABLES LIKE ‘character%’;</p>
<p>• SHOW VARIABLES LIKE ‘collation%’;</p>
<p>• SQL函数HEX、LENGTH、CHAR_LENGTH</p>
<p>• SQL函数CHARSET、COLLATION</p>
<h4>使用MySQL字符集时的建议</h4>
<p>• 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集，而不是依赖于MySQL的默认设置，否则MySQL升级时可能带来很大困扰；</p>
<p>•  数据库和连接字符集都使用latin1时虽然大部分情况下都可以解决乱码问题，但缺点是无法以字符为单位来进行SQL操作，一般情况下将数据库和连接字符 集都置为utf8是较好的选择；</p>
<p>• 使用mysql C  API时，初始化数据库句柄后马上用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8，这样就不用显式地用  SET NAMES语句指定连接字符集，且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8；</p>
<p>• 对于mysql PHP API，一般页面级的PHP程序总运行时间较短，在连接到数据库以后显式用SET  NAMES语句设置一次连接字符集即可；但当使用长连接时，请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集。</p>
<h4>其他注意事项</h4>
<p>•  my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集，不会对使用 libmysqlclient库的应用程序产生任何作用！</p>
<p>• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的，不受连接字符集设置的影响。</p>
<p>• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响，对于比较之类的操作可能产生完全不同的结果，需要小心！</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4606/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL索引的索引长度问题</title>
		<link>http://blog.haohtml.com/index.php/archives/4595</link>
		<comments>http://blog.haohtml.com/index.php/archives/4595#comments</comments>
		<pubDate>Tue, 13 Jul 2010 03:10:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[索引]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4595</guid>
		<description><![CDATA[MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。查看索引可以使用show index from tbl_name命令，语法见：http://blog.haohtml.com/index.php/archives/1889 在MyISAM表中，创建组合索引时，创建的索引长度 不能超过1000，注意这里索引的长度的计算是根据表字段设定的长度来标量的，例如： create table test( id int,name1 varchar(300), name2 varchar(300), name3 varchar(500) )charset=latin1 engine=myisam; create index test_name on test(name1,name2,name3); 此时报错：Specified key was too long;max key length is 1000 bytes. 修改表结构:alter table test convert to charset utf8; create index test_name3 on test(name3). 此时warning：Specified key was too long;max key length is 1000 bytes.但是索引创建成功，查看表结构可以看到创建的索引是一个前缀索引:‘key [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制。查看索引可以使用show index from tbl_name命令，语法见：<a href="http://blog.haohtml.com/index.php/archives/1889" target="_blank">http://blog.haohtml.com/index.php/archives/1889</a><br />
在MyISAM表中，创建组合索引时，创建的索引长度 不能超过1000，注意这里索引的长度的计算是根据表字段设定的长度来标量的，例如：</p>
<blockquote><p>create table test(<br />
id  int,name1 varchar(300),<br />
name2 varchar(300),<br />
name3  varchar(500)<br />
)charset=latin1 engine=myisam;</p>
<p>create index test_name on  test(name1,name2,name3);</p></blockquote>
<p>此时报错：Specified key was too long;max key  length is 1000 bytes.</p>
<p>修改表结构:alter table test convert to charset  utf8;<br />
create index test_name3 on test(name3).<br />
此时warning：Specified  key was too long;max key length is 1000  bytes.但是索引创建成功，查看表结构可以看到创建的索引是一个前缀索引:‘key test_name3(name3(333))’<span id="more-4595"></span></p>
<p><strong>得出的结论是：</strong>对于myisam表，如果创建<span style="color: #0000ff;">组合索引</span>，所创建的索引长度和不能超过<span style="color: #0000ff;">1000</span> bytes，否则会报错，创建失败；而对于myisam的<span style="color: #0000ff;">单列索引</span>，最大长度也不能超过1000，否则会报警，但是创建成功，最终创建的是前缀索引（取前<span style="color: #0000ff;"> 333</span>个字节）。</p>
<p>在Innodb表中,创建组合索引：</p>
<blockquote><p>create table test1(<br />
id int,name1  varchar(300),<br />
name2 varchar(300),<br />
name3 varchar(500)<br />
)charset=latin1  engine=innodb;<br />
create index test1_name on test(name1,name2,name3);<br />
此时给出warning：Specified key was too long;max key length is 767 bytes.</p></blockquote>
<p>修改表结构:alter table test1 convert to charset utf8;<br />
create index  test1_name3 on test(name3).<br />
此时给出warning：Specified key was too  long;max key length is 767 bytes.</p>
<p><strong>得出的结论是：</strong>对于创建innodb的<span style="color: #0000ff;">组合索引</span>，如果各个列中的长度不超过<span style="color: #0000ff;">767</span>，则不再计算所有列的总长度，如果有超过767的，则给出报警，索引最后创建成功，但是对于超过767字节的列取前缀索引；而对于 innodb的<span style="color: #0000ff;">单列索引</span>，超过767的，给出warning，最终索引创建成功，取前缀索引（取前<span style="color: #0000ff;">255</span>字节）。</p>
<p>来源：http://samyubw.blog.51cto.com/978243/223773</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4595/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>show profiles 详解</title>
		<link>http://blog.haohtml.com/index.php/archives/4561</link>
		<comments>http://blog.haohtml.com/index.php/archives/4561#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:15:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4561</guid>
		<description><![CDATA[来源:http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html This section does not apply to MySQL Enterprise Server users. SHOW PROFILE [type [, type] ... ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]] type: ALL &#124; BLOCK IO &#124; CONTEXT SWITCHES &#124; CPU &#124; IPC &#124; MEMORY &#124; PAGE FAULTS &#124; SOURCE &#124; SWAPS The SHOW PROFILES and SHOW PROFILE statements display profiling information that [...]]]></description>
			<content:encoded><![CDATA[<p>来源:<a href="http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html">http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html</a></p>
<p>This section does not apply to MySQL Enterprise Server users.</p>
<p><a name="id3224955"></a><a name="id3224964"></a></p>
<pre>SHOW PROFILE [<em>type</em> [, <em>type</em>] ... ]      [FOR QUERY <em>n</em>]      [LIMIT <em>row_count</em> [OFFSET <em>offset</em>]]    <em>type</em>:      ALL    | BLOCK IO    | CONTEXT SWITCHES    | CPU    | IPC    | MEMORY    | PAGE FAULTS    | SOURCE    | SWAPS</pre>
<p>The <a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a> and <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> statements display profiling information that indicates resource usage for statements executed during the course of the current session.</p>
<p>Profiling is controlled by the <a href="server-system-variables.html#sysvar_profiling">profiling</a> session variable, which has a default value of 0 (OFF). Profiling is enabled by setting <a href="server-system-variables.html#sysvar_profiling">profiling</a> to 1 or ON:</p>
<pre>mysql&gt; <strong>SET profiling = 1;</strong>  <span id="more-4561"></span></pre>
<p><a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a> displays a list of the most recent statements sent to the master. The size of the list is controlled by the <a href="server-system-variables.html#sysvar_profiling_history_size">profiling_history_size</a> session variable, which has a default value of 15. The maximum value is 100. Setting the value to 0 has the practical effect of disabling profiling.</p>
<p>All statements are profiled except <a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a> and <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a>, so you will find neither of those statements in the profile list. Malformed statements are profiled. For example, SHOW PROFILING is an illegal statement, and a syntax error occurs if you try to execute it, but it will show up in the profiling list.</p>
<p><a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> displays detailed information about a single statement. Without the FOR QUERY <em>n</em> clause, the output pertains to the most recently executed statement. If FOR QUERY <em>n</em> is included, <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> displays information for statement <em>n</em>. The values of <em>n</em> correspond to the Query_ID values displayed by <a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a>.</p>
<p>The LIMIT <em>row_count</em> clause may be given to limit the output to <em>row_count</em> rows. If LIMIT is given, OFFSET<em>offset</em> may be added to begin the output <em>offset</em> rows into the full set of rows.</p>
<p>By default, <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> displays Status and Duration columns. The Status values are like the State values displayed by <a title="12.4.5.27. SHOW PROCESSLIST Syntax" href="show-processlist.html">SHOW PROCESSLIST</a>, althought there might be some minor differences in interpretion for the two statements for some status values (see <a title="7.5.6. Examining Thread Information" href="thread-information.html">Section 7.5.6, “Examining Thread Information”</a>).</p>
<p>Optional <em>type</em> values may be specified to display specific additional types of information:</p>
<div>
<ul>
<li>ALL displays all information</li>
<li>BLOCK IO displays counts for block input and output operations</li>
<li>CONTEXT SWITCHES displays counts for voluntary and involuntary context switches</li>
<li>CPU displays user and system CPU usage times</li>
<li>IPC displays counts for messages sent and received</li>
<li>MEMORY is not currently implemented</li>
<li>PAGE FAULTS displays counts for major and minor page faults</li>
<li>SOURCE displays the names of functions from the source code, together with the name and line number of the file in which the function occurs</li>
<li>SWAPS displays swap counts</li>
</ul>
</div>
<p>Profiling is enabled per session. When a session ends, its profiling information is lost.</p>
<pre>mysql&gt; <strong>SELECT @@profiling;</strong>  +-------------+  | @@profiling |  +-------------+  |           0 |  +-------------+  1 row in set (0.00 sec)    mysql&gt; <strong>SET profiling = 1;</strong>  Query OK, 0 rows affected (0.00 sec)    mysql&gt; <strong>DROP TABLE IF EXISTS t1;</strong>  Query OK, 0 rows affected, 1 warning (0.00 sec)    mysql&gt; <strong>CREATE TABLE T1 (id INT);</strong>  Query OK, 0 rows affected (0.01 sec)    mysql&gt; <strong>SHOW PROFILES;</strong>  +----------+----------+--------------------------+  | Query_ID | Duration | Query                    |  +----------+----------+--------------------------+  |        0 | 0.000088 | SET PROFILING = 1        |  |        1 | 0.000136 | DROP TABLE IF EXISTS t1  |  |        2 | 0.011947 | CREATE TABLE t1 (id INT) |  +----------+----------+--------------------------+  3 rows in set (0.00 sec)    mysql&gt; <strong>SHOW PROFILE;</strong>  +----------------------+----------+  | Status               | Duration |  +----------------------+----------+  | checking permissions | 0.000040 |  | creating table       | 0.000056 |  | After create         | 0.011363 |  | query end            | 0.000375 |  | freeing items        | 0.000089 |  | logging slow query   | 0.000019 |  | cleaning up          | 0.000005 |  +----------------------+----------+  7 rows in set (0.00 sec)    mysql&gt; <strong>SHOW PROFILE FOR QUERY 1;</strong>  +--------------------+----------+  | Status             | Duration |  +--------------------+----------+  | query end          | 0.000107 |  | freeing items      | 0.000008 |  | logging slow query | 0.000015 |  | cleaning up        | 0.000006 |  +--------------------+----------+  4 rows in set (0.00 sec)    mysql&gt; <strong>SHOW PROFILE CPU FOR QUERY 2;</strong>  +----------------------+----------+----------+------------+  | Status               | Duration | CPU_user | CPU_system |  +----------------------+----------+----------+------------+  | checking permissions | 0.000040 | 0.000038 |   0.000002 |  | creating table       | 0.000056 | 0.000028 |   0.000028 |  | After create         | 0.011363 | 0.000217 |   0.001571 |  | query end            | 0.000375 | 0.000013 |   0.000028 |  | freeing items        | 0.000089 | 0.000010 |   0.000014 |  | logging slow query   | 0.000019 | 0.000009 |   0.000010 |  | cleaning up          | 0.000005 | 0.000003 |   0.000002 |  +----------------------+----------+----------+------------+  7 rows in set (0.00 sec)</pre>
<div>
<h3>Note</h3>
<p>Profiling is only partially functional on some architectures. For values that depend on the getrusage() system call, NULL is returned on systems such as Windows that do not support the call. In addition, profiling is per process and not per thread. This means that activity on threads within the server other than your own may affect the timing information that you see.</p>
</div>
<p><a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a> and <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> were added in MySQL 5.0.37.</p>
<p>You can also get profiling information from the <a title="19.17. The INFORMATION_SCHEMA PROFILING Table" href="profiling-table.html">PROFILING</a> table in INFORMATION_SCHEMA. See <a title="19.17. The INFORMATION_SCHEMA PROFILING Table" href="profiling-table.html">Section 19.17, “The INFORMATION_SCHEMA PROFILING Table”</a>. For example, the following queries produce the same result:</p>
<pre>SHOW PROFILE FOR QUERY 2;    SELECT STATE, FORMAT(DURATION, 6) AS DURATION  FROM INFORMATION_SCHEMA.PROFILING  WHERE QUERY_ID = 2 ORDER BY SEQ;</pre>
<div>
<h3>Important</h3>
<p>Please note that the <a title="12.4.5.28. SHOW PROFILE Syntax" href="show-profile.html">SHOW PROFILE</a> and <a title="12.4.5.29. SHOW PROFILES Syntax" href="show-profiles.html">SHOW PROFILES</a> functionality is part of the MySQL 5.0 Community Server only.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4561/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
