杰克工作室 发表于 2023-2-28 14:32

Mysql 随机查询10条数据效率最快的查询方法:三种方法对比[归档]

<h5>1)使用join 和 rand() 耗时 0.009</h5>

<pre>
SELECT * FROM&nbsp;`t_topic`&nbsp;AS&nbsp;t1 JOIN&nbsp;(
&nbsp;   SELECT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROUND(&nbsp;RAND()&nbsp;*&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;MAX(id)&nbsp;FROM&nbsp;`t_topic`)&nbsp;-&nbsp;(SELECT&nbsp;MIN(id)&nbsp;FROM&nbsp;`t_topic`)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;+&nbsp;(SELECT&nbsp;MIN(id)&nbsp;FROM&nbsp;`t_topic`)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;AS&nbsp;id
)&nbsp;AS&nbsp;t2 WHERE
&nbsp;&nbsp;&nbsp;&nbsp;t1.id&nbsp;&gt;=&nbsp;t2.idORDER&nbsp;BY&nbsp;t1.id
LIMIT&nbsp;10;</pre>

<p>&nbsp;</p>

<h5>2) 下面这条比上面那个还要慢几秒</h5>

<pre>
SELECT&nbsp;*&nbsp;FROM&nbsp;`t_topic`&nbsp;
WHERE&nbsp;id&nbsp;&gt;=&nbsp;(SELECT&nbsp;floor(&nbsp;RAND()&nbsp;*&nbsp;((SELECT&nbsp;MAX(id)&nbsp;FROM&nbsp;`t_topic`)-(SELECT&nbsp;MIN(id)&nbsp;FROM&nbsp;`t_topic`))&nbsp;+&nbsp;(SELECT&nbsp;MIN(id)&nbsp;FROM&nbsp;`t_topic`)))&nbsp;&nbsp;
ORDER&nbsp;BY&nbsp;id&nbsp;LIMIT&nbsp;10;</pre>

<p>&nbsp;</p>

<h5>3)或者使用下面这个也可以测试也是 耗时0.0012</h5>

<pre>
SELECT * FROM
&nbsp;&nbsp;&nbsp;&nbsp;`t_topic` WHERE
&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&gt;=&nbsp;(&nbsp;
&nbsp;          SELECT&nbsp;floor(RAND()&nbsp;*&nbsp;(SELECT&nbsp;MAX(id)&nbsp;FROM&nbsp;`t_topic`)&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;) ORDER&nbsp;BY id
LIMIT&nbsp;10;</pre>

<p>&nbsp;</p>

杰克工作室 发表于 2023-2-28 14:38

实例:mysql从600万数据中随机取10条数据<br />
&nbsp;
<p>通常数据量少的时候我们会这样写:</p>

<pre>
SELECT * FROM _article ORDER BY RAND() LIMIT 10</pre>

<p>在1千条数据内,效果还行,但是,随着数据量慢慢增多,上了5万条数据的时候,上面的写法会导致数据库性能急剧下降。</p>

<p>现在数据量为:</p>

<p><img alt="" src="data/attachment/forum/202302/28/2ee41d4fd9a81f0729b5409cb6f45a32.jpg" /></p>

<p>我们来看下上面的随机取数据所消耗的时间:</p>

<p><img alt="" src="data/attachment/forum/202302/28/61cabe744732a02712502795b39b41fb.jpg" /></p>

<p>我的天呐,这样取数据,数据库会让你给搞爆的。</p>

<p>我们来看下大牛怎样写:</p>

<pre>
SELECT * FROM _article AS r1 JOIN
(SELECT CEIL(RAND() * (SELECT MAX(article_id) FROM_article)) AS article_id) AS r2
WHERE r1.article_id &gt;= r2.article_id
ORDER BY r1.article_id ASC
LIMIT 10</pre>

<p><img alt="" src="data/attachment/forum/202302/28/9075a3b8c1f082ea227b94b4f04e992a.jpg" /></p>

<p>&nbsp;</p>
页: [1]
查看完整版本: Mysql 随机查询10条数据效率最快的查询方法:三种方法对比[归档]