MySQL深入——8

Order by語句是如何工作的?

首先我們來創建一個表

CREATE TABLE `t` (`id` int(11) NOT NULL,`city` varchar(16) NOT NULL,`name` varchar(16) NOT NULL,`age` int(11) NOT NULL,`addr` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`),KEY `city` (`city`)
) ENGINE=InnoDB;

全字段排序?

?scelect city, name ,age from t where city="杭州" order by name limit 1000;

為了避免全表掃描,我們需要給city加上一個索引,然后使用explain語句去查詢,其中extra這個字段中的“using filesort”表示需要排序。

?Mysql對其分配出一塊內存用于排序,內存成為sort_buffer,city=杭州找出來后,初始化sort_buffer放入city name id這三個字段,對sort_buffer中的name字段進行快速排序,取出前1000行返回給客戶端。

按照name排序,可能在內存當中完成,也可能需要外部排序,這取決于所需內存及其參數sort_buffer_size,當name太大的時候,內存放不下,就得使用外部排序進行,就是Mysql開辟sort_buffer_size的大小。

那么如何判斷一個文件是否使用了臨時文件呢??

optimizer_trace='enabled=on'

開啟優化跟蹤,Mysql開啟追蹤查詢優化器的決策過程,記錄有關優化器如何選擇執行計劃的詳細信息,information_schema是一個特殊的數據庫,這個數據庫存儲了關于數據庫,表,列,索引,權限等方面的信息,允許用戶查詢和了解數據庫的結構和狀態。

使用這個查詢中number_of_tmp_files表示的是排序過程中使用臨時文件數,那么為什么使用了12個臨時文件呢,Mysql將其分為12份,每一份單獨排序后存在于臨時文件中,再將12個有序文件合并成為一個有序的大文件。

如果sort_buffer_size超過了需要排序的數據量大小,number_of_tmp_files的數值就為0,表示可以在內存中進行排序。

否則就需要在外部排序,sort_buffer_size 越小,需要分成的份數越多,number_of_tmp_files就越大。

rowid排序

在全排序當中,是對原表的數據讀了一遍,剩下的操作都是在sort_buffer和臨時表當中執行的,但是這存在著一個問題,就是當查詢的時候要返回很多字段的時候,sort_buffer當中要存放的字段數太多,這樣內存當中能同時放下的行數就很少,這樣要分為很多個臨時文件,排序的時候性能會很差,所以我們來使用rowid排序來解決這種問題。

當Mysql認為排序的單行長度太大的時候會采用另外一種算法即為rowid算法。流程是這樣的,初始化sort_buffer確定放入兩個字段name 和id。從索引city當中取出滿足city=“杭州”的主鍵id,然后從這個主鍵id中取出整行,取出id和name存入sort_buffer,然后接著重復從索引city中取出滿足條件的主鍵id,直到不滿足為止。

因為只要排序的列name字段和主鍵id,少了city和age字段的值,不能直接返回了。存的是主鍵id的順序,到時候遍歷排序結果,取前1000行,并按照id的值到原表當中取出city,name和age三個字段返回客戶端。

這樣的話需要進行排序的內存就會變小,相應的臨時文件也相應的變小了。

比較

Mysql在擔心內存不夠用的時候會使用第二種算法來進行排序,但是會增加磁盤訪問,因為第二次返回值的時候,是從主鍵當中再次訪問原表返回的,這就體現出來Mysql的一個思想:如果內存夠就多利用內存,減少磁盤訪問。

我們還可以使用覆蓋索引和聯合索引來解決,其實并不是所有的order by語句都要進行排序操作的,Mysql之所以要生成臨時表做排序操作,是因為原來所有的數據都是無序的,但是如果它天然就是按照name遞增排序的呢?

覆蓋索引是指,索引上的信息足夠滿足查詢請求,不需要再回到主鍵索引上去取數據。

按照這個概念,我們創建一個name ,city ,age 的聯合索引,因為name是遞增天然的,我們就不需要排序直接返回了,直到city不為杭州的時候結束。使用這個的時候,我們可以看extra下面的字段顯示是不是需要排序來決定。因為不是每一個查詢都能使用上覆蓋索引,就需要把所有的字段都建立起聯合索引,因為索引的維護也是有代價的,所以這是一個需要權衡的決定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210921.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL命令---刪除數據表

介紹 使用sql語句實現刪除數據表。 命令 drop table 表名;

Python實戰演練之python實現神經網絡模型算法

python實現神經網絡模型算法 今天,厾羅和大家分享用Python實現神經網絡模型算法,僅用于技術學習交流。 實現技巧 1.導入依賴庫 主要是安裝相關的依賴庫。本文實現的環境為:python 3.7。 from __future__ import division import math …

C語言聯合體

聯合體 聯合體聯合體基本概念聯合體特點聯合體內存結構圖 聯合體 聯合體基本概念 聯合體概念: 結構體(struct)是一種結構體類型或者復雜類型,它可以包含多個類型不同的成員另外一種和結構體非常類似的類型,叫做聯合…

GPT-4 變懶了?官方回復

你是否注意到,最近使用 ChatGPT 的時候,當你向它提出一些問題,卻得到的回應似乎變得簡短而敷衍了?對于這一現象,ChatGPT 官方給出了回應。 譯文:我們聽到了你們所有關于 GPT4 變得更懶的反饋!我…

在HTML中插入音頻和視頻(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹在HTML中插入音頻和視頻以及部分理論知識 🍉歡迎點贊 👍 收藏 ?留言評論 📝私信必回喲😁 🍉博主收將持續更新學習記錄獲,友友們有任何問題可以在評論區留言 …

外匯交易中的MT4軟件優勢:解析軟件對交易的影響!

近年來,隨著金融科技的不斷發展,MT4軟件作為外匯交易領域的領先平臺,備受交易者青睞。本文將探討MT4軟件在外匯交易中的優勢以及對交易的影響,幫助讀者深入了解這一交易利器。 ### 1. MT4軟件概述 MetaTrader 4(簡稱MT4)是一款由M…

深度學習 時間序列回歸學習筆記

目錄 常用的深度學習時間序列回歸模型: ARIMA模型 ETS模型 效果評估

低多邊形3D建模動畫風格紋理貼圖

在線工具推薦: 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時,有幾種不同的風格&#xf…

【Linux】make/Makefile --- 自動化構建項目的工具

目錄 一、make/Makefile的簡單使用 二、Makefile 的語法規則 三、實現的原理 3.1 make/Makefile識別文件新舊 3.2 .PHONY修飾的偽目標總是被執行 3.3 make/Makefile是具有依賴性的推導能力的 四、語法技巧 五、注意事項 Linux中自動化構建項目最簡單的方式:…

python樂觀鎖和悲觀鎖

在并發編程中,鎖是一種常用的機制,用于保護共享資源的訪問。樂觀鎖和悲觀鎖是兩種不同的鎖機制。 樂觀鎖:不會一開始就加鎖,在更新的時候,判斷一下在此期間別人是否修改了數據,若修改了不執行此操作&#…

軟件質量:建立信心的十大指標

. Bug 數量——可能按優先級或嚴重性排列 一般來說,錯誤的數量會在項目生命周期的中期開始增加。在截止日期之前的幾天或幾周(取決于項目的規模),團隊將集中精力減少 bug 的數量,直到 bug 的數量達到某種漸近線。這個漸…

Nginx基礎篇:Nginx搭建、Nginx反向代理、文件服務器部署配置。

Nginx Linux系統安裝以及反向代理的配置 簡介優點nginx 環境安裝常用Nginx 命令nginx 文件服務器搭建 簡介 Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點…

如何把kubernetes pod中的文件拷貝到宿主機上或者把宿主機上文件拷貝到kubernetes pod中

1. 創建一個 Kubernetes Pod 首先&#xff0c;下面是一個示例Pod的定義文件&#xff08;pod.yaml&#xff09;&#xff1a; cat > nginx.yaml << EOF apiVersion: v1 kind: Pod metadata:name: my-nginx spec:containers:- name: nginximage: nginx EOF kubectl app…

LabelImg的使用及注意事項

LabelImg是一款開源的圖像標注工具&#xff0c;它主要用于標注目標檢測、語義分割和圖像分類等深度學習中需要的數據集。通過使用LabelImg&#xff0c;用戶可以快速、準確地為圖片中的目標添加標注信息&#xff0c;從而建立數據集。 使用步驟&#xff1a; 下載LabelImg&#x…

java測試rtsp地址連接狀態,測試RTSP連接狀態是否成功,java如何測試rtsp地址連接是否成功

import java.net.Socket; import java.net.URI; import java.net.URISyntaxException;/*** ClassName: RTSPUtils* Description: 測試RTSP連接狀態* Author: zhanghui* Date: 2023-12-08* Version: 1.0**/ public class RTSPUtils {private static final int TIMEOUT_MS 10000…

我的創作紀念日(2周年)

機緣 在進入大學之前&#xff0c;完全沒有聽說過CSDN&#xff0c;第一次使用CSDN應該是搜C語言如何學&#xff0c;或者是和C語言相關的其他內容 因為我本人是學計算機專業的&#xff0c;大一剛開學因為疫情延遲了開學時間&#xff0c;老師線上教課&#xff0c;但是我之前是完…

永磁同步電機反電動勢系數怎么算?磁鏈強度怎么算?轉矩系數怎么算?

在進行永磁同步電機simulink仿真時&#xff0c;一個關鍵參數就是永磁體磁鏈強度&#xff0c; 實際上在simulink中&#xff0c;永磁體磁鏈強度/反電動勢系數/轉矩系數這三個是放一起的&#xff0c;這是因為他們都可互相算出來。 Torque constat (Nm/A) 轉矩系數 1.5 * Np *…

在瀏覽器中存儲token的最佳實踐

在瀏覽器中存儲token的最佳實踐 Web 應用程序不是靜態站點&#xff0c;而是靜態和動態內容的精心組合。更常見的是&#xff0c;Web 應用程序邏輯在瀏覽器中運行。該應用程序不是從服務器獲取所有內容&#xff0c;而是在瀏覽器中運行 JavaScript&#xff0c;從后端 API 獲取數據…

Tomcat部署開源站點JPress

前言 JPress使用Java開發&#xff0c;是我們常見的開源博客系統。JPress是一個開源的WordPress插件&#xff0c;它提供了一個簡單而強大的方式來創建企業級站點。該插件包括許多特性&#xff0c;例如主題定制、頁面構建器、性能優化、SEO、安全、電子商務和社交媒體整合等。使用…

Linux卸載MySql(簡潔版)

安裝MySql https://blog.csdn.net/tongxin_tongmeng/article/details/128263398 停止服務 service mysql stop 刪除服務 chkconfig --del mysql 刪除目錄 rm -rf /opt/mysql 刪除配置 rm -f /etc/my.cnf 刪除啟動腳本 rm -f /etc/init.d/mysql 刪除用戶和組 userdel mysql &am…