[mysql]可以提高mysql資料庫性能的10個隨機取資料語法

最近剛好寫到隨機廣告的部分,如果用PHP來處理亂數資料會非常麻煩而且效率會很低,因為必須從mysql資料庫中取出全部資料在亂數取出所要的筆數,如果資料庫龐大,這樣做就會讓網站開起時間又慢了一些,而且感覺好像有點繞遠路,畢竟資料庫本身就有提供隨機函數可以使用,因此我收集了10個常用的隨機取資料的方法。

隨機取一條資料:

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

這是最常見的方法,但在大數據量下效率較低。

使用主鍵隨機取一條資料:

SELECT * FROM table_name WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table_name))) LIMIT 1;

這種方法利用主鍵的特性,效率較高。

隨機取多條資料:

SELECT * FROM table_name ORDER BY RAND() LIMIT 10;

同樣的方法,但這會增加查詢時間。

使用 JOIN 隨機取一條資料:

SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;

使用 JOIN 可以提高效率。

隨機取多條資料(JOIN 方法):

SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 5;

這樣可以獲得多條資料,且效率較高。

使用 OFFSET 隨機取一條資料:

SET @rand_id = FLOOR(1 + RAND() * (SELECT COUNT(*) FROM table_name));
SELECT * FROM table_name LIMIT 1 OFFSET @rand_id;

此方法在大數據量下表現良好。

隨機取一條資料(使用 MIN 和 MAX):

SELECT * FROM table_name WHERE id >= (SELECT FLOOR(RAND() * ((SELECT MAX(id) FROM table_name)-(SELECT MIN(id) FROM table_name)) + (SELECT MIN(id) FROM table_name))) LIMIT 1;

結合最小和最大 ID 確保隨機性。

隨機取一條資料(不重複):

SELECT * FROM table_name WHERE id NOT IN (SELECT id FROM previous_selection ORDER BY RAND() LIMIT 10) ORDER BY RAND() LIMIT 1;

確保不會重複選擇之前的結果。

使用子查詢獲得隨機資料:

SELECT * FROM (SELECT * FROM table_name ORDER BY RAND() LIMIT 100) AS temp_table ORDER BY RAND() LIMIT 1;

首先隨機選擇多條,再從中選擇一條。

使用 GROUP BY 隨機取一條資料:

SELECT * FROM (SELECT *, RAND() AS rand_order FROM table_name) AS temp_table GROUP BY rand_order LIMIT 1;

利用 GROUP BY 和 RAND() 隨機選擇一條資料。

這些語法可以根據具體需求和數據量來選擇使用,以獲得更好的性能和隨機性。

Previous Post Next Post