MySQL随机查询语句优化


如果要从表中随机取数据,可以使用下面的语句获取

SELECT * FROM wp_website_article_p ORDER BY RAND() LIMIT 10

数据较多的情况下,需要消耗更多的时间

SELECT * FROM wp_website_article_p ORDER BY RAND() LIMIT 10;
/* 受影响记录行数: 0  已找到记录行: 10  警告: 0  持续时间 1 查询: 5.046 秒. */

5.046 秒的查询时间,很显然无法接受。

可以通过下面的查询语句优化,前提是表中含有主键id字段

SELECT 
 *
FROM
 (
SELECT ROUND(RAND() * (
SELECT MAX(id)
FROM
 `wp_website_article_p`)) random_num,
 @num:=@num + 1
FROM
 (
SELECT @num:=0) AS a, `wp_website_article_p`
LIMIT 10) AS b,
 `wp_website_article_p` AS t
WHERE
 b.random_num = t.id

数据较多的情况下,基本可以在1秒内获取到数据

SELECT 
 *
FROM
 (
SELECT ROUND(RAND() * (
SELECT MAX(id)
FROM
 `wp_website_article_p`)) random_num,
 @num:=@num + 1
FROM
 (
SELECT @num:=0) AS a, `wp_website_article_p`
LIMIT 10) AS b,
 `wp_website_article_p` AS t
WHERE
 b.random_num = t.id;
/* 受影响记录行数: 0  已找到记录行: 10  警告: 0  持续时间 1 查询: 0.015 秒. */

相对来说,优化后的查询语句虽然复杂了,但是查询效率是显著提升了。