<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://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>https://jackxiang.com/post//</link>
<title><![CDATA[mysql组合索引最左前缀的结果。简单的理解就是只从最左面的开始组合]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 13 Aug 2009 07:48:55 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录，只不过city,age,school的组合各不相同。<br/>&nbsp;&nbsp;来看这条T-SQL：<br/>&nbsp;&nbsp;&nbsp;&nbsp;select i_testID FROM myIndex where vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;首先考虑建单列索引：<br/>&nbsp;&nbsp;&nbsp;&nbsp; 在vc_Name列上建立了索引。执行T-SQL时，MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上，取出来放到一中间结果集。在这个结果集里，先排除掉vc_City不等于"郑州"的记录，再排除i_Age不等于25的记录，最后筛选出唯一的符合条件的记录。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;虽然在vc_Name上建立了索引，查询时MYSQL不用扫描整张表，效率有所提高，但离我们的要求还有一定的距离。同样的，在vc_City和i_Age分别建立的单列索引的效率相似。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;为了进一步榨取MySQL的效率，就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里：<br/>&nbsp;&nbsp;&nbsp;&nbsp;alter TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了，建表时，vc_Name长度为50，这里为什么用10呢？因为一般情况下名字的长度不会超过10，这样会加速索引查询速度，还会减少索引文件的大小，提高insert的更新速度。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;执行T-SQL时，MySQL无须扫描任何记录就到找到唯一的记录！！<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 肯定有人要问了，如果分别在vc_Name,vc_City,i_Age上建立单列索引，让该表有3个单列索引，查询时和上述的组合索引效率一样吧？嘿嘿，大不一样，远远低于我们的组合索引~~虽然此时有了三个索引，但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;建立这样的组合索引，其实是相当于分别建立了<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vc_Name,vc_City,i_Age<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vc_Name,vc_City<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vc_Name<br/>&nbsp;&nbsp;&nbsp;&nbsp;这样的三个组合索引！为什么没有vc_City,i_Age等这样的组合索引呢？这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引，下面的几个T-SQL会用到：<br/>&nbsp;&nbsp;&nbsp;&nbsp;select * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"<br/>&nbsp;&nbsp;&nbsp;&nbsp;select * FROM myIndex WHREE vc_Name="erquan"<br/>而下面几个则不会用到：<br/>&nbsp;&nbsp;&nbsp;&nbsp;select * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"<br/>&nbsp;&nbsp;&nbsp;&nbsp;select * FROM myIndex WHREE vc_City="郑州" 
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] mysql组合索引最左前缀的结果。简单的理解就是只从最左面的开始组合]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>