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 秒. */
相对来说,优化后的查询语句虽然复杂了,但是查询效率是显著提升了。