首页
/
每日頭條
/
生活
/
mysql生成随機函數
mysql生成随機函數
更新时间:2025-12-27 09:24:32

CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; delimiter ;; create procedure idata() begin declare i int; set i=0; while i<10000 do insert into words(word) values(concat(char(97 (i div 1000)), char(97 (i % 1000 div 100)), char(97 (i % 100 div 10)), char(97 (i % 10)))); set i=i 1; end while; end;; delimiter ; call idata();

如何随機取3個單詞

select word from words order by rand() limit 3; -- 查看上面語句的執行情況 explain select word from words order by rand() limit 3;

mysql生成随機函數(MySQL随機函數RAND)1

Extra中Using temporary表示使用臨時表,Using filesort表示需要執行排序操作。

上述默認使用的臨時表是内存表,對于内存表來說,回表過程隻是簡單地根據數據行的位置直接訪問内存得到數據,并不會導緻額外的磁盤訪問,因此MySQL會在排序時會優先使用rowid排序。

上述SQL語句的執行過程如下:

  1. 創建一個臨時表(該表使用的是memory引擎),表裡有兩個字段,第一個字段是double類型(記為字段R),第二個字段是varchar(64)類型(記為字段W),臨時表沒有索引
  2. 從word表中,按照主鍵順序取出所有的word值,對于每一個word值,調用rand函數生成一個大于0小于1的随機小數,把該随機小數和word值存入臨時表的R和W字段中,至此掃描行數是10000
  3. 臨時表目前有10000行數據,下面需要對這個臨時表按照字段R進行排序
  4. 初始化sort_buffer,sort_buffer中有兩個字段,一個是double類型,另一個是整型
  5. 從内存臨時表中逐行取出R值和位置信息,分别存入sort_buffer中的兩個字段,此時掃描行數又增加了10000行,變成了20000(MySQL8.0.12以後這裡還是10000行,應該是對内存表做了優化,有知道的朋友可以留言告訴我)
  6. 在sort_buffer中根據R值進行排序
  7. 排序完成以後,取出前三個結果的位置信息,到内存臨時表中取出word值,返回給客戶端。總掃描行數變為20003(MySQL8.0以後這裡是10003行)。

MySQL8.0下慢查詢日志如下圖,掃描行數為100003行:

mysql生成随機函數(MySQL随機函數RAND)2

臨時表隻能是内存表麼?

答案是NO。那什麼時候臨時表會使用内存,什麼時候又會使用磁盤呢?該選擇主要依賴于tmp_table_size參數的控制,默認是16M,如果臨時表的大小超過了tmp_table_size,那麼内存臨時表就會轉換為磁盤臨時表。

磁盤臨時表使用的默認引擎是InnoDB,由參數default_tmp_storage_engine控制。

set tmp_table_size=1024; set sort_buffer_size=32768; set max_length_for_sort_data=16; /* 打開 optimizer_trace,隻對本線程有效 */ SET optimizer_trace='enabled=on'; /* 執行語句 */ select word from words order by rand() limit 3; /* 查看 OPTIMIZER_TRACE 輸出 */ SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G

mysql生成随機函數(MySQL随機函數RAND)3

在我們上圖的輸出中,我們可以看出排序算法使用了優先隊列排序算法,然後是全字段排序(也就是說不用回表)。

peak_memory_used代表排序時使用到的内存,按道理應該等于sort_buffer_size指定的值,之所以不等的原因是作者本人的MySQL是8.0.12版本。

MySQL8.0.12之前,MySQL優化器會為排序直接分配sort_buffer_size指定大小的内存,但從MySQL8.0.12開始,為排序分配内存是以增量的方式進行

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
12種家電萬萬不要買
12種家電萬萬不要買
人們常說一分價錢一分貨,價格昂貴的東西品質更高,功能更全,但是這并不代表它們具有實用性。尤其是一些家具家電,價格高的極有可能是智商稅,以下這4款家電就是如此,下面就來看一下它們是誰吧。一、不買洗烘一體機洗烘一體機,顧名思義,是洗衣機和烘幹機...
2025-12-27
cf手遊花鑽石最好用的英雄女角色
cf手遊花鑽石最好用的英雄女角色
CF手遊女性角色夜玫瑰怎麼樣?在CF手遊中有很多女性角色,其中就包括夜玫瑰。今天小編就給大家介紹一下CF手遊女角色夜玫瑰獲得方式吧。穿越火線手遊夜玫瑰女角色夜玫瑰怎麼獲得夜玫瑰需要花費1680鑽石才能獲得,但是夜玫瑰是永久的,不限時的。所以...
2025-12-27
普京和埃爾多安克裡姆林宮會晤
普京和埃爾多安克裡姆林宮會晤
俄羅斯總統新聞秘書佩斯科夫21日表示,俄羅斯總統普京對于同烏克蘭方面舉行談判一直持開放态度。當天早些時候,土耳其總統埃爾多安表示,希望能組織一次俄羅斯總統普京與烏克蘭總統澤連斯基之間的會晤。他表示,計劃于近期就此事與俄烏兩國領導人電話溝通。...
2025-12-27
怎麼折簡單又漂亮的千紙鶴教程
怎麼折簡單又漂亮的千紙鶴教程
注:如果您之前從未嘗試過折紙,那麼我們建議您先查看我發的初學者指南。我們彙總了以下說明,以指導您準确地自己折疊一個。你準備好折疊了嗎?那麼讓我們開始吧!步驟1)從紙的白色面朝上開始,對角對折。步驟2)再次沿虛線對折。步驟3)将翻蓋向後折疊,...
2025-12-27
微信可以登上qq嗎
微信可以登上qq嗎
騰訊家的大兒子QQ和小兒子WeChat最近聯手幹了件很有意思的事情。騰訊QQ向微信平台推出了微信小程序版【騰訊QQ】。這個小程序并非憑空出現的新項目,而是原先的QQ空間時光機更名而來。目前微信小程序版QQ主要有兩個功能:接收消息和切換賬戶。...
2025-12-27
Copyright 2023-2025 - www.tftnews.com All Rights Reserved