<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[MySQL优化案例]系列 -- 用TIMESTAMP类型取代INT和DATETIME 【里面包含存储过程】]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 06 Nov 2008 09:34:33 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	1. 准备<br/><br/>创建一个测试表：<br/><br/><br/><div class="code">mysql&gt; CREATE TABLE `t` (<br/>`d1` int(10) unsigned NOT NULL default &#039;0&#039;,<br/>`d2` timestamp NOT NULL default CURRENT_TIMESTAMP,<br/>`d3` datetime NOT NULL,<br/>KEY `d2` (`d2`),<br/>KEY `d1` (`d1`),<br/>KEY `d3` (`d3`)<br/>);</div><br/><br/>然后创建一个存储过程填充数据： <br/><br/> <br/><br/><div class="code">mysql&gt; DELIMITER //<br/>CREATE PROCEDURE INS_T()<br/>BEGIN<br/>SET @i=1;<br/>WHILE 0&lt;1<br/>DO<br/>SET @i=@i+1;<br/>INSERT INTO t VALUES (1199116800+@i, FROM_UNIXTIME(1199116800+@i), FROM_UNIXTIME(1199116800+@i));<br/>END WHILE;<br/>END;//<br/>DELIMITER ;</div><br/><br/>run stroe process:<br/><br/><div class="code">call INS_T();</div>时间戳 1199116800 表示 2008-01-01 这个时间点。然后运行存储过程，大概填充几十万条记录后，中止执行，因为上面的存储过程是个死循环，所以需要人工中止（ctrl+c）。<br/>删除存储过程： <br/><div class="code">DROP PROCEDURE test.INS_T;</div><br/><br/>查看存储过程：<br/><br/><br/><div class="code">SHOW CREATE PROCEDURE&nbsp;&nbsp;test.INS_T;</div><br/><br/>来看看到底有多少条记录了，以及索引情况：<br/><br/><div class="code">mysql&gt; select count(*) from t;<br/>+----------+<br/>&#124; count(*) &#124;<br/>+----------+<br/>&#124;&nbsp;&nbsp; 924707 &#124;<br/>+----------+<br/>mysql&gt; analyze table t;<br/>+--------+---------+----------+-----------------------------+<br/>&#124; Table&nbsp;&nbsp;&#124; Op&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; Msg_type &#124; Msg_text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>+--------+---------+----------+-----------------------------+<br/>&#124; test.t &#124; analyze &#124; status&nbsp;&nbsp; &#124; Table is already up to date &#124;<br/>+--------+---------+----------+-----------------------------+<br/>mysql&gt; show index from t;<br/>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+<br/>&#124; Table &#124; Non_unique &#124; Key_name &#124; Seq_in_index &#124; Column_name &#124; Collation &#124; Cardinality &#124; Sub_part &#124; Packed &#124; Null &#124; Index_type &#124; Comment &#124;<br/>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+<br/>&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;924707 &#124;&nbsp;&nbsp;&nbsp;&nbsp; NULL &#124; NULL&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; BTREE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;924707 &#124;&nbsp;&nbsp;&nbsp;&nbsp; NULL &#124; NULL&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; BTREE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124; d3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;924707 &#124;&nbsp;&nbsp;&nbsp;&nbsp; NULL &#124; NULL&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; BTREE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+</div><br/><br/><br/>2. 对比<br/><br/>2.1 只检索一条记录<br/><br/><br/><div class="code">mysql&gt; explain select * from t where d1 = 1199579155;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp; &#124; rows &#124; Extra &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ref&nbsp;&nbsp;&#124; d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d1&nbsp;&nbsp; &#124; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; const &#124;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>mysql&gt; explain select * from t where d2 = &#039;2008-01-06 08:25:55&#039;;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp; &#124; rows &#124; Extra &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ref&nbsp;&nbsp;&#124; d2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d2&nbsp;&nbsp; &#124; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; const &#124;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>mysql&gt; explain select * from t where d3 = &#039;2008-01-06 08:25:55&#039;;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp; &#124; rows &#124; Extra &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ref&nbsp;&nbsp;&#124; d3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d3&nbsp;&nbsp; &#124; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; const &#124;&nbsp;&nbsp;&nbsp;&nbsp;1 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+-------+------+-------+</div><br/><br/>2.2 范围检索（我发现当大于时候根本没有用到索引，小于用到了）<br/><div class="code">mysql&gt; explain select * from t where d1 &lt;= 1199894400;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type&nbsp;&nbsp;&#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp; &#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; range &#124; d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d1&nbsp;&nbsp; &#124; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL &#124; 121961 &#124; Using where &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>mysql&gt; explain select * from t where d2 &lt;= from_unixtime(1199894400);<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type&nbsp;&nbsp;&#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp; &#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; range &#124; d2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d2&nbsp;&nbsp; &#124; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL &#124; 121961 &#124; Using where &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>mysql&gt; explain select * from t where d3 &lt;= from_unixtime(1199894400);<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type&nbsp;&nbsp;&#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp; &#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; range &#124; d3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; d3&nbsp;&nbsp; &#124; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL &#124; 120625 &#124; Using where &#124;<br/>+----+-------------+-------+-------+---------------+------+---------+------+--------+-------------+</div><br/>小贴士：<br/>explain select * from t where d2 &lt;= from_unixtime(1199894400);&nbsp;&nbsp; key_len :为4<br/>explain select * from t where d3 &lt;= from_unixtime(1199894400);&nbsp;&nbsp; key_len :为8<br/>效率体现出来了吧？呵呵！<br/><br/><br/><br/>话外音：当大于时候根本没有用到索引，如下:(和下面in和=关于索引的情况类似，但这个&gt; 和&lt; 的情况我还是不太清楚,呵呵)<br/><br/><div class="code">mysql&gt;&nbsp;&nbsp;explain select * from t where d1 &gt;= 1199894400;<br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp;&nbsp;&nbsp;&#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ALL&nbsp;&nbsp;&#124; d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; 9871898 &#124; Using where &#124; <br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/><br/><br/>mysql&gt; explain select * from t where d2 &gt;= from_unixtime(1199894400); <br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp;&nbsp;&nbsp;&#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ALL&nbsp;&nbsp;&#124; d2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; 9871898 &#124; Using where &#124; <br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/><br/>mysql&gt; explain select * from t where d3 &gt;= from_unixtime(1199894400); <br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124; id &#124; select_type &#124; table &#124; type &#124; possible_keys &#124; key&nbsp;&nbsp;&#124; key_len &#124; ref&nbsp;&nbsp;&#124; rows&nbsp;&nbsp;&nbsp;&nbsp;&#124; Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+<br/>&#124;&nbsp;&nbsp;1 &#124; SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; t&nbsp;&nbsp;&nbsp;&nbsp; &#124; ALL&nbsp;&nbsp;&#124; d3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&#124; NULL &#124; 9871898 &#124; Using where &#124; <br/>+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+</div><br/><br/><br/><br/><br/>小结：从上面的2次对比中可以看到，对 d1 或 d2 字段检索时的索引长度都是 4，因为 TIMESTAMP 实际上是 4字节 的 INT 值。因此，实际应用中，基本上完全可以采用 TIMESTAMP 来代替另外2种类型了，并且 TIMESTAMP 还能支持自动更新成当前最新时间，何乐而不为呢？<br/><br/><br/><br/><br/> in 和 = 在索引上的区别，建表：<br/><br/><div class="code">CREATE TABLE `mytest` (<br/>&nbsp;&nbsp;`id` int(11) NOT NULL auto_increment,<br/>&nbsp;&nbsp;`uid` int(11) NOT NULL,<br/>&nbsp;&nbsp;`rstatus` int(11) default NULL,<br/>&nbsp;&nbsp;PRIMARY KEY&nbsp;&nbsp;(`id`),<br/>&nbsp;&nbsp;KEY `uid` (`uid`)<br/>) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8</div><br/><br/><br/><div class="code">EXPLAIN SELECT * <br/>FROM `mytest` <br/>FORCE INDEX ( uid ) <br/>WHERE uid =1<br/>AND rstatus =1 </div><br/><br/>发现用上了uid的索引，但这个in语句：<br/><br/><div class="code">explain SELECT * FROM `mytest`&nbsp;&nbsp;WHERE uid IN ( 1,2,7) and rstatus =1 </div><br/>没有用上uid索引。<br/><br/>为此：认为要建立联合索引？是的，不光是要建立联合索引，而且和顺序有关，如建立：<br/>alter table mytest add index tt(uid,rstatus);<br/>也没有用，这样后运行：<br/><br/><div class="code">explain SELECT * FROM `mytest`&nbsp;&nbsp;WHERE uid IN ( 1,2,7) and rstatus =1</div><br/>也没有用到我们想要的tt索引，但是，我们将联合索引换个顺序：<br/><div class="code">alter table mytest add index tt(rstatus，uid);</div><br/>执行：<br/><div class="code">explain SELECT * FROM `mytest`&nbsp;&nbsp;WHERE uid IN ( 1,2,7) and rstatus =1</div>，就用到了我们的联合索引了!<br/>如下说明：<br/>1.in 和 = 在索引机制上的不同！<br/>2.in 的mysql索引和顺序有关！<br/>最后：我去掉联合索引，加入了强制用uid的索引：<br/>但：<br/><div class="code">SELECT * FROM `mytest` force index(uid) WHERE uid IN ( 1,2,7) and rstatus =1 </div>也就ok了！<br/><br/><br/><br/><br/>来源：<br/>http://imysql.cn/2008_07_17_timestamp_vs_int_and_datetime<br/>修正了存储过程的代码！<br/><br/><br/><br/>附录：<br/>&nbsp;&nbsp;<br/><br/>描述<br/><br/>CREATE PROCEDURE<br/>&nbsp;&nbsp;<br/><br/>建立一个存放在MySQL数据库的表格的存储过程。<br/><br/>CREATE FUNCTION<br/>&nbsp;&nbsp;<br/><br/>建立一个用户自定义的函数，尤其是返回数据的存储过程。<br/><br/>ALTER PROCEDURE<br/>&nbsp;&nbsp;<br/><br/>更改用CREATE PROCEDURE 建立的预先指定的存储过程，其不会影响相关存储过程或存储功能。.<br/><br/>ALTER FUNCTION<br/>&nbsp;&nbsp;<br/><br/>更改用CREATE FUNCTION 建立的预先指定的存储过程，其不会影响相关存储过程或存储功能。.<br/><br/>DROP PROCEDURE<br/>&nbsp;&nbsp;<br/><br/>从MySQL的表格中删除一个或多个存储过程。<br/><br/>DROP FUNCTION<br/>&nbsp;&nbsp;<br/><br/>从MySQL的表格中删除一个或多个存储函数。<br/><br/>SHOW CREATE PROCEDURE<br/>&nbsp;&nbsp;<br/><br/>返回使用CREATE PROCEDURE 建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。<br/><br/>SHOW CREATE FUNCTION<br/>&nbsp;&nbsp;<br/><br/>返回使用CREATE&nbsp;&nbsp;FUNCTION建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。<br/><br/>SHOW PROCEDURE STATUS<br/>&nbsp;&nbsp;<br/><br/>返回一个预先指定的存储过程的特性，包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。<br/><br/>SHOW FUNCTION STATUS<br/>&nbsp;&nbsp;<br/><br/>返回一个预先指定的存储函数的特性，包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。<br/><br/>CALL<br/>&nbsp;&nbsp;<br/><br/>调用一个使用CREATE PROCEDURE建立的预先指定的存储过程。<br/><br/>BEGIN ... END<br/>&nbsp;&nbsp;<br/><br/>包含一组执行的多声明。<br/><br/>DECLARE<br/>&nbsp;&nbsp;<br/><br/>用于指定当地变量、环境、处理器，以及指针。<br/><br/>SET<br/>&nbsp;&nbsp;<br/><br/>用于更改当地和全局服务器变量的值。<br/><br/>SELECT ... INTO<br/>&nbsp;&nbsp;<br/><br/>用于存储显示变量的纵列。<br/><br/>OPEN<br/>&nbsp;&nbsp;<br/><br/>用于打开一个指针。<br/><br/>FETCH<br/>&nbsp;&nbsp;<br/><br/>使用特定指针来获得下一列。<br/><br/>CLOSE<br/>&nbsp;&nbsp;<br/><br/>用于关闭和打开指针。<br/><br/>IF<br/>&nbsp;&nbsp;<br/><br/>一个An if-then-else-end if 声明。<br/><br/>CASE ... WHEN<br/>&nbsp;&nbsp;<br/><br/>一个 case声明的结构<br/><br/>LOOP<br/>&nbsp;&nbsp;<br/><br/>一个简单的循环结构；可以使用LEAVE 语句来退出。<br/><br/>LEAVE<br/>&nbsp;&nbsp;<br/><br/>用于退出IF，CASE，LOOP，REPEAT以及WHILE 语句。<br/><br/>ITERATE<br/>&nbsp;&nbsp;<br/><br/>用于重新开始循环。<br/><br/>REPEAT<br/>&nbsp;&nbsp;<br/><br/>在结束时测试的循环。<br/><br/>WHILE<br/>&nbsp;&nbsp;<br/><br/>在开始时测试的循环。<br/><br/>RETURNS<br/>&nbsp;&nbsp;<br/><br/>返回一个存储过程的值。<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [MySQL优化案例]系列 -- 用TIMESTAMP类型取代INT和DATETIME 【里面包含存储过程】]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>