<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>《MySQL Order By Rand()效率》的评论</title>
	<atom:link href="http://ourmysql.com/archives/143/feed" rel="self" type="application/rss+xml" />
	<link>http://ourmysql.com/archives/143</link>
	<description>我们致力于一个MySQL知识的分享网站</description>
	<lastBuildDate>Sat, 12 May 2012 08:14:43 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>作者：Jedy</title>
		<link>http://ourmysql.com/archives/143/comment-page-1#comment-46046</link>
		<dc:creator>Jedy</dc:creator>
		<pubDate>Tue, 01 Jun 2010 07:05:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.ourmysql.com/?p=143#comment-46046</guid>
		<description>join比where快是因为mysql做了多余的优化。
SELECT * FROM `table`
WHERE id &gt;= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))) 
ORDER BY id LIMIT 1;
实际上执行的是
SELECT * FROM `table`
WHERE id &gt;= floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)) 
ORDER BY id LIMIT 1;
变成了按id顺序读，每行判断id是否大于floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))，取第一次满足的行，所以用where并不是均匀随机的，得到的应该都是id比较小的行。当然这种方法本身无法保证均匀随机，所以join也不是，不过要好多了。</description>
		<content:encoded><![CDATA[<p>join比where快是因为mysql做了多余的优化。<br />
SELECT * FROM `table`<br />
WHERE id &gt;= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))<br />
ORDER BY id LIMIT 1;<br />
实际上执行的是<br />
SELECT * FROM `table`<br />
WHERE id &gt;= floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))<br />
ORDER BY id LIMIT 1;<br />
变成了按id顺序读，每行判断id是否大于floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))，取第一次满足的行，所以用where并不是均匀随机的，得到的应该都是id比较小的行。当然这种方法本身无法保证均匀随机，所以join也不是，不过要好多了。</p>
]]></content:encoded>
	</item>
</channel>
</rss>

