记录一下MySQL数据库高性能的随机数据查询方式
这里用typecho的表为例子,typecho随机文章需要此方法
第一种,标签式查询
SELECT
*
FROM
typecho_contents
WHERE
cid >=(
SELECT
FLOOR(
RAND() *(
SELECT
MAX(cid)
FROM
typecho_contents
))
) AND TYPE = 'post' AND
STATUS
= 'publish'
ORDER BY
cid
LIMIT 10;第二种,JOIN查询
SELECT
*
FROM
typecho_contents,
(
SELECT
cid AS sid
FROM
typecho_contents
WHERE
typecho_contents.type = 'post' AND typecho_contents.status = 'publish'
ORDER BY
RAND()
LIMIT 10) AS tmp
WHERE
typecho_contents.cid = tmp.sid
LIMIT 10;第三种,标签式+JOIN查询同时使用
SELECT
*
FROM
typecho_contents AS r1
JOIN(
SELECT
CEIL(
RAND() *(
SELECT
MAX(cid)
FROM
typecho_contents
)) AS id
) AS r2
WHERE
r1.cid >= r2.id AND r1.cid <= r2.id+20 AND r1.type = 'post' AND r1.status = 'publish'
ORDER BY
r1.cid ASC
LIMIT 10;这几种方式个人总结
由于第一种+第三种标签式是先取出随机ID再查询,导致扫描表的范围不固定,查询速度随机.
第二种独立JOIN查询是先取出固定ID,再查询表,查询速率恒定,更优秀.
我又分析了一下,第一种不用创建临时表也许是最快的,即使扫描大多数行仍然很快
我又研究了一下,第三种可以限制扫描行数,也是非常快的
如果理解的不对,请自行修正,本文仅供参考

此处评论已关闭