自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL隨機(jī)查詢的優(yōu)化實(shí)例

數(shù)據(jù)庫 MySQL
MySQL隨機(jī)查詢效率并不一定很高,我們需要將MySQL隨機(jī)查詢進(jìn)行一定的優(yōu)化,讓MySQL隨機(jī)查詢的效率更加出色。

MySQL隨機(jī)查詢的效率如果想得到提高,就需要進(jìn)行優(yōu)化,下面就為您介紹一個(gè)MySQL隨機(jī)查詢優(yōu)化成功的例子,供您借鑒參考。

一直以為MySQL隨機(jī)查詢幾條數(shù)據(jù),就用

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

就可以了。
但是真正測(cè)試一下才發(fā)現(xiàn)這樣的MySQL隨機(jī)查詢效率非常低。一個(gè)15萬余條的庫,查詢5條數(shù)據(jù),居然要8秒以上

查看官方手冊(cè),也說rand()放在ORDER BY 子句中會(huì)被執(zhí)行多次,自然效率及很低。

You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

搜索Google,網(wǎng)上基本上都是查詢max(id) * rand()來隨機(jī)獲取數(shù)據(jù)。

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

但是這樣會(huì)產(chǎn)生連續(xù)的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因?yàn)?5萬條的表,查詢只需要0.01秒不到。

上面的語句采用的是JOIN,mysql的論壇上有人使用

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

我測(cè)試了一下,需要0.5秒,速度也不錯(cuò),但是跟上面的語句還是有很大差距??傆X有什么地方不正常。

于是我把語句改寫了一下。

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

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

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

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))  ORDER BY id LIMIT 1;

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

最后在php中對(duì)這兩個(gè)語句進(jìn)行分別查詢10次,
前者花費(fèi)時(shí)間 0.147433 秒
后者花費(fèi)時(shí)間 0.015130 秒
看來采用JOIN的語法比直接在WHERE中使用函數(shù)效率還要高很多。
 

 

 

【編輯推薦】

查看MySQL服務(wù)器的進(jìn)程

MySQL慢查詢的啟用方法

Mysql多表查詢的實(shí)現(xiàn)

MySQL創(chuàng)建函數(shù)問題的處理方法

MySQL賬戶密碼的修改方法

責(zé)任編輯:段燃 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2021-02-24 07:44:36

MySQL隨機(jī)恢復(fù)

2010-11-25 14:52:35

MySQL隨機(jī)查詢

2010-06-12 15:31:04

MySQL查詢優(yōu)化

2010-11-25 14:21:16

MySQL查詢分頁

2010-05-18 09:02:55

MySQL條件查詢

2010-10-12 16:44:36

MySQL語句

2011-07-29 09:38:04

SQL查詢優(yōu)化

2010-11-22 16:22:39

MySQL連接查詢

2018-06-07 08:54:01

MySQL性能優(yōu)化索引

2010-11-25 10:28:28

MySQL查詢優(yōu)化器

2025-01-15 12:48:30

2021-06-03 19:55:55

MySQ查詢優(yōu)化

2010-05-18 17:32:33

MySQL查詢優(yōu)化

2010-10-13 16:31:18

優(yōu)化MySQL查詢

2017-07-25 15:35:07

MysqlMysql優(yōu)化LIMIT分頁

2019-09-11 10:40:49

MySQL大分頁查詢數(shù)據(jù)庫

2013-01-04 10:00:12

MySQL數(shù)據(jù)庫數(shù)據(jù)庫查詢優(yōu)化

2010-05-31 16:46:40

2010-05-27 16:12:10

MySQL索引

2010-05-26 14:06:44

MySQL查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)