国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL中從表中取出隨機(jī)數(shù)據(jù)性能優(yōu)化

2024-07-24 12:38:19
字體:
供稿:網(wǎng)友

在mysql中隨機(jī)讀取數(shù)據(jù)的方法可能大家最簡單且常用的做是rand() 這個(gè)函數(shù),但是如果上千萬數(shù)據(jù)就有問題了,下面我來介紹.

最簡的辦法

rand() 函數(shù)實(shí)例,代碼如下:

SELECT * FROM table_name ORDER BY rand() LIMIT 5;

花時(shí)間為 0.7888.

如果這樣在數(shù)據(jù)量大時(shí)就掛了,后來找到一個(gè)辦法,代碼如下:

  1. SELECT * FROM table_name AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS 
  2.  
  3. r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5; 
  4.  
  5. --花時(shí)間0.02 sec 

上面的語句采用的是JOIN,mysql的論壇上有人使用,代碼如下:

  1. SELECT *  
  2. FROM `table`  
  3. WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )  
  4. ORDER BY id LIMIT 1; 

我測試了一下,需要0.5秒,速度也不錯(cuò),但是跟上面的語句還是有很大差距,總覺有什么地方不正常,于是我把語句改寫了一下,代碼如下:

  1. SELECT * FROM `table`  
  2. WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))   
  3. ORDER BY id LIMIT 1; 

這下,效率又提高了,查詢時(shí)間只有0.01秒.

最后,再把語句完善一下,加上MIN(id)的判斷,我在最開始測試的時(shí)候,就是因?yàn)闆]有加上MIN(id)的判斷,結(jié)果有一半的時(shí)間總是查詢到表中的前面幾行.

完整查詢語句是,代碼如下:

  1. SELECT * FROM `table`  
  2. WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + 
  3.  
  4. (SELECT MIN(id) FROM `table`)))  ORDER BY id LIMIT 1; 
  5. --Vevb.com 
  6.  
  7. SELECT *  
  8. FROM `tableAS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM 
  9.  
  10. `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2  
  11. WHERE t1.id >= t2.id  
  12. ORDER BY t1.id LIMIT 1; 

最后在php中對這兩個(gè)語句進(jìn)行分別查詢10次,前者花費(fèi)時(shí)間 0.147433 秒,后者花費(fèi)時(shí)間 0.015130 秒.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开鲁县| 大冶市| 正宁县| 安泽县| 贡山| 玛多县| 普宁市| 龙门县| 体育| 綦江县| 防城港市| 金堂县| 郑州市| 榆社县| 榕江县| 酉阳| 清苑县| 吉隆县| 茂名市| 田东县| 河曲县| 灵武市| 周至县| 化德县| 平定县| 赣榆县| 新田县| 蒙自县| 青州市| 若羌县| 阿城市| 荆州市| 绥德县| 吉林市| 宝丰县| 广昌县| 策勒县| 石渠县| 韶关市| 固原市| 柳江县|