<?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>水草树 &#187; 主键</title>
	<atom:link href="http://mifunny.info/tag/%e4%b8%bb%e9%94%ae/feed" rel="self" type="application/rss+xml" />
	<link>http://mifunny.info</link>
	<description>走走停停看看，恍然大悟。</description>
	<lastBuildDate>Sun, 25 Mar 2012 15:09:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MERGE例子中的union搜索优化</title>
		<link>http://mifunny.info/optimization-for-an-union-select-305.html</link>
		<comments>http://mifunny.info/optimization-for-an-union-select-305.html#comments</comments>
		<pubDate>Sat, 07 Nov 2009 10:02:41 +0000</pubDate>
		<dc:creator>LD</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Study notes]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Union优化]]></category>
		<category><![CDATA[主键]]></category>

		<guid isPermaLink="false">http://mifunny.info/optimization-for-an-union-select-305.html</guid>
		<description><![CDATA[在 MERGE存储引擎的简单测试 – MySQL邯郸学步 一文中,有一个Union SELECT, 极其消耗时间, 仔细分析会发现,使用的搜索条件对应字段是TIMESTAMP, 索引几乎没用. 那么我们能不能绕开时间字段,使用作为主键的自增字段object_id 呢? 就单纯示例上这种情况,是可以的. 请看下面的存储过程: &#160;1 DELIMITER $$ &#160;2 &#160;3 DROP&#160;PROCEDURE&#160;IF&#160;EXISTS&#160;`testMERGE`.`unionSelect`$$ &#160;4 CREATE&#160;PROCEDURE&#160;`testMERGE`.`unionSelect` (IN&#160;startTime CHAR(16), IN&#160;endTime CHAR(16)) &#160;5 BEGIN &#160;6 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/* 表test1结果集的总数，结果集开始ID， 结束ID */ &#160;7 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DECLARE t1_count BIGINT DEFAULT&#160;0;&#160;&#160;&#160;&#160; &#160;8 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DECLARE t1_startId BIGINT DEFAULT&#160;0;&#160;&#160; &#160;9 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DECLARE t1_endId BIGINT DEFAULT&#160;0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 10 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DECLARE t2_count BIGINT DEFAULT&#160;0; 11 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DECLARE t2_startId [...]]]></description>
			<content:encoded><![CDATA[<p>在 <a href="http://mifunny.info/test-merge-in-mysql-5139-304.html" rel="bookmark" title="Permanent Link to MERGE存储引擎的简单测试 – MySQL邯郸学步">MERGE存储引擎的简单测试 – MySQL邯郸学步</a> 一文中,有一个Union SELECT, 极其消耗时间, 仔细分析会发现,使用的搜索条件对应字段是TIMESTAMP, 索引几乎没用.  那么我们能不能绕开时间字段,使用作为主键的自增字段object_id 呢? 就单纯示例上这种情况,是可以的. 请看下面的存储过程:</p>
<p><span id="more-305"></span><br />
<font color="#ffff00">&nbsp;1 </font>DELIMITER $$<br />
<font color="#ffff00">&nbsp;2 </font><br />
<font color="#ffff00">&nbsp;3 </font><font color="#ffff00">DROP</font>&nbsp;<font color="#ff40ff">PROCEDURE</font>&nbsp;<font color="#ff40ff">IF</font>&nbsp;<font color="#ffff00">EXISTS</font>&nbsp;`testMERGE`.`unionSelect`$$<br />
<font color="#ffff00">&nbsp;4 </font><font color="#ffff00">CREATE</font>&nbsp;<font color="#ff40ff">PROCEDURE</font>&nbsp;`testMERGE`.`unionSelect` (<font color="#ffff00">IN</font>&nbsp;startTime <font color="#00ff00">CHAR</font>(<font color="#ff6060">16</font>), <font color="#ffff00">IN</font>&nbsp;endTime <font color="#00ff00">CHAR</font>(<font color="#ff6060">16</font>))<br />
<font color="#ffff00">&nbsp;5 </font><font color="#ff40ff">BEGIN</font><br />
<font color="#ffff00">&nbsp;6 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#8080ff">/* 表test1结果集的总数，结果集开始ID， 结束ID */</font><br />
<font color="#ffff00">&nbsp;7 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t1_count BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<font color="#ffff00">&nbsp;8 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t1_startId BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;&nbsp;&nbsp; <br />
<font color="#ffff00">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t1_endId BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<font color="#ffff00">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t2_count BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;<br />
<font color="#ffff00">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t2_startId BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;&nbsp;&nbsp; <br />
<font color="#ffff00">12 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DECLARE t2_endId BIGINT <font color="#ff40ff">DEFAULT</font>&nbsp;<font color="#ff6060">0</font>;<br />
<font color="#ffff00">13 </font><br />
<font color="#ffff00">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#8080ff">/* 先确定两个结果集的开始、结束ID，判断小集合; */</font><br />
<font color="#ffff00">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;object_id <font color="#ff40ff">INTO</font>&nbsp;t1_startId <font color="#ff40ff">FROM</font>&nbsp;t1 <font color="#ff40ff">WHERE</font>&nbsp;date_format(updated, <font color="#ff6060">&#8216;%Y-%m-%d&#8217;</font>) &gt;= startTime <font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;object_id LIMIT <font color="#ff6060">1</font>;<br />
<font color="#ffff00">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;object_id <font color="#ff40ff">INTO</font>&nbsp;t1_endId <font color="#ff40ff">FROM</font>&nbsp;t1 <font color="#ff40ff">WHERE</font>&nbsp;date_format(updated, <font color="#ff6060">&#8216;%Y-%m-%d&#8217;</font>) &lt;= endTime <font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;object_id <font color="#ff40ff">DESC</font>&nbsp;LIMIT <font color="#ff6060">1</font>;<br />
<font color="#ffff00">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SET</font>&nbsp;t1_count = t1_endId &#8211; t1_startId;<br />
<font color="#ffff00">18 </font><br />
<font color="#ffff00">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;object_id <font color="#ff40ff">INTO</font>&nbsp;t2_startId <font color="#ff40ff">FROM</font>&nbsp;t2 <font color="#ff40ff">WHERE</font>&nbsp;date_format(updated, <font color="#ff6060">&#8216;%Y-%m-%d&#8217;</font>) &gt;= startTime <font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;object_id LIMIT <font color="#ff6060">1</font>;<br />
<font color="#ffff00">20 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;object_id <font color="#ff40ff">INTO</font>&nbsp;t2_endId <font color="#ff40ff">FROM</font>&nbsp;t2 <font color="#ff40ff">WHERE</font>&nbsp;date_format(updated, <font color="#ff6060">&#8216;%Y-%m-%d&#8217;</font>) &lt;= endTime <font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;object_id <font color="#ff40ff">DESC</font>&nbsp;LIMIT <font color="#ff6060">1</font>;<br />
<font color="#ffff00">21 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SET</font>&nbsp;t2_count = t2_endId &#8211; t2_startId;<br />
<font color="#ffff00">22 </font><br />
<font color="#ffff00">23 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#8080ff">/* 小集合驱动大集合;&nbsp;&nbsp;利用主键object_id作为搜索条件！ */</font><br />
<font color="#ffff00">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">IF</font>&nbsp;t1_count &lt; t2_count <font color="#ff40ff">THEN</font><br />
<font color="#ffff00">25 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;* <font color="#ff40ff">FROM</font>&nbsp;t1 <font color="#ff40ff">WHERE</font>&nbsp;object_id <font color="#ffff00">BETWEEN</font>&nbsp;t1_startId <font color="#ffff00">AND</font>&nbsp;(t1_endId+<font color="#ff6060">1</font>) <br />
<font color="#ffff00">26 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">UNION</font>&nbsp;<font color="#ffff00">ALL</font>&nbsp;<font color="#ffff00">SELECT</font>&nbsp;* <font color="#ff40ff">FROM</font>&nbsp;t2 <font color="#ff40ff">WHERE</font>&nbsp;object_id <font color="#ffff00">BETWEEN</font>&nbsp;t2_startId <font color="#ffff00">AND</font>&nbsp;(t2_endId+<font color="#ff6060">1</font>) <br />
<font color="#ffff00">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;updated <font color="#ff40ff">DESC</font>&nbsp;LIMIT <font color="#ff6060">0</font>,<font color="#ff6060">50</font>;<br />
<font color="#ffff00">28 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">ELSE</font><br />
<font color="#ffff00">29 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">SELECT</font>&nbsp;* <font color="#ff40ff">FROM</font>&nbsp;t2 <font color="#ff40ff">WHERE</font>&nbsp;object_id <font color="#ffff00">BETWEEN</font>&nbsp;t2_startId <font color="#ffff00">AND</font>&nbsp;(t2_endId+<font color="#ff6060">1</font>)<br />
<font color="#ffff00">30 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffff00">UNION</font>&nbsp;<font color="#ffff00">ALL</font>&nbsp;<font color="#ffff00">SELECT</font>&nbsp;* <font color="#ff40ff">FROM</font>&nbsp;t1 <font color="#ff40ff">WHERE</font>&nbsp;object_id <font color="#ffff00">BETWEEN</font>&nbsp;t1_startId <font color="#ffff00">AND</font>&nbsp;(t1_endId+<font color="#ff6060">1</font>) <br />
<font color="#ffff00">31 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">ORDER</font>&nbsp;<font color="#ff40ff">BY</font>&nbsp;updated <font color="#ff40ff">DESC</font>&nbsp;LIMIT <font color="#ff6060">0</font>,<font color="#ff6060">50</font>;<br />
<font color="#ffff00">32 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff40ff">END</font>&nbsp;<font color="#ff40ff">IF</font>;<br />
<font color="#ffff00">33 </font><br />
<font color="#ffff00">34 </font><font color="#ff40ff">END</font>$$<br />
<font color="#ffff00">35 </font><br />
<font color="#ffff00">36 </font>DELIMITER ;</p>
<p>
mysql&gt; call unionSelect(<font color="#ff6060">&#8217;2009-10-01&#8242;</font>, <font color="#ff6060">&#8217;2009-10-31&#8242;</font>);<br />
&nbsp;<font color="#8080ff">&#8212;&#8212;-&gt; </font><br />
Query OK, <font color="#ff6060">0</font>&nbsp;<font color="#ff40ff">rows</font>&nbsp;affected (<font color="#ff6060">0</font>.<font color="#ff6060">97</font>&nbsp;sec)<br />
多次执行，执行时间为维持在1s左右; 执行时间是原来的一半不到;<br />
</p>
<p>LD不是DBA，不过开发中消耗资源比较大的SELECT语句，尽量使用索引，尤其是唯一索引。</p>
]]></content:encoded>
			<wfw:commentRss>http://mifunny.info/optimization-for-an-union-select-305.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

