[mysql]可以提高mysql資料庫性能的10個隨機取資料語法
03, Jun最近剛好寫到隨機廣告的部分,如果用PHP來處理亂數資料會非常麻煩而且效率會很低,因為必須從mysql資料庫中取出全部資料在亂數取出所要的筆數,如果資料庫龐大,這樣做就會讓網站開起時間又慢了一些,而且感覺好像有點繞遠路,畢竟資料庫本身就有提供隨機函數可以使用,因此我收集了10個常用的隨機取資料的方法。
Table of Contents
隨機取一條資料:
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() 隨機選擇一條資料。
這些語法可以根據具體需求和數據量來選擇使用,以獲得更好的性能和隨機性。