在mysql中查詢10條不重復(fù)的數(shù)據(jù)攀操,使用以下:
SELECT * FROM `tableName` ORDERBY?RAND()? LIMIT 10
就可以了监右。但是真正測試一下才發(fā)現(xiàn)這樣效率非常低晋渺。一個(gè)21萬余條的庫澜薄,查詢10條數(shù)據(jù)狗唉,居然要10秒以上
搜索Google侣滩,網(wǎng)上基本上都是查詢max(id) * rand()來隨機(jī)獲取數(shù)據(jù)口注。
SQL語句如下:
SELECT * FROM `fb_tb_goods` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `fb_tb_goods` WHERE status in (1,3) AND cj_level in (2,3) )-(SELECT MIN(id) FROM `fb_tb_goods` WHERE status in (1,3) AND cj_level in (2,3)))+(SELECT MIN(id) FROM `fb_tb_goods` WHERE status in (1,3) AND cj_level in (2,3))) AS aid) AS t2 WHERE t1.id >= t2.aid and t1.status in (1,3)ORDER BY t1.id LIMIT 16
我測試了一下,需要0.5秒君珠,速度也不錯(cuò)寝志,但是跟上面的語句還是有很大差距〔咛恚總覺有什么地方不正常材部。
于是我把語句改寫了一下。
SELECT * FROM `fb_tb_goods` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `fb_tb_goods`)-(SELECT MIN(id) FROM `fb_tb_goods`))+(SELECT MIN(id) FROM `fb_tb_goods`)) AS aid) AS t2 WHERE t1.id >= t2.aid and t1.status in (1,3) ORDER BY t1.id LIMIT 26;
這下唯竹,效率又提高了乐导,查詢時(shí)間只有0.01秒
最后,再把語句完善一下浸颓,加上MIN(id)的判斷物臂。我在最開始測試的時(shí)候产上,就是因?yàn)闆]有加上MIN(id)的判斷,結(jié)果有一半的時(shí)間總是查詢到表中的前面幾行晋涣。
The End