首頁 資料庫 mysql教程 mysql排序區別

mysql排序區別

May 07, 2019 pm 05:17 PM
mysql

由淺入深詳細說說MySQL排序模式,怎麼影響MySQL選擇不同的排序模式和怎麼最佳化排序。

推薦課程:MySQL教學

mysql排序區別

排序是資料庫中的一個基本功能,MySQL也不例外。

使用者透過Order by語句即能達到將指定的結果集排序的目的,其實不只是Order by語句,Group by語句,Distinct語句都會隱含使用排序。本文首先會簡單介紹SQL如何利用索引避免排序代價,接著會介紹MySQL實作排序的內部原理。

解決大家的以下問題:

MySQL在哪些地方會使用排序,怎麼判斷MySQL使用了排序;

MySQL有幾種排序模式,透過什麼方法讓MySQL選擇不同的排序模式;

MySQL排序跟read_rnd_buffer_size有啥關係,在哪些情況下增加read_rnd_buffer_size能優化排序;

怎麼判斷MySQL使用到了磁碟來排序,怎麼避免或優化磁碟排序;

排序時變長欄位(varchar)資料在記憶體是怎麼儲存的,5.7有哪些改進;

在情況下,排序模式有哪些改進;

sort_merge_pass到底是什麼,該狀態值過大說明了什麼問題,可以透過什麼方法解決;

 MySQL使用到了排序的話,依序可以透過什麼辦法分析和最佳化讓排序更快?

二、排序

我們透過explain查看MySQL執行計劃時,常常會看到在Extra列中顯示Using filesort。

對於無法利用索引避免排序的SQL,資料庫必須自己實作排序功能以滿足使用者需求,此時SQL的執行計劃中會出現“Using filesort”,這裡需要注意的是filesort並不意味著就是檔案排序,其實也有可能是記憶體排序,這個主要由sort_buffer_size參數與結果集大小決定。

其實這種情況就表示MySQL使用了排序。 Using filesort常出現在order by、group by、distinct、join等情況下。

MySQL內部實作排序主要有3種方式,常規排序,優化排序與優先隊列排序。

CREATE TABLE t1(id int, col1 varchar(64), col2 varchar(64), col3 varchar(64), PRIMARY KEY(id),key(col1,col2));
SELECT col1,col2,col3 FROM t1 WHERE col1>100 ORDER BY col2;
登入後複製

請看這三個排序的差異:

#a.常規排序

##(1) .從表t1中取得滿足WHERE條件的記錄

(2).對於每筆記錄,將記錄的主鍵排序鍵(id,col2)取出放入sort buffer

(3 ).如果sort buffer可以存放所有滿足條件的(id,col2)對,則進行排序;否則sort buffer滿後,進行排序並固化到臨時文件中。 (排序演算法採用的是快速排序演算法)

(4).若排序中產生了臨時文件,需要利用歸併排序演算法,保證臨時文件中記錄是有序的

#( 5).循環執行上述過程,直到所有滿足條件的記錄全部參與排序

(6).掃描排好序的(id,col2)對,並利用id去撈取SELECT需要返回的列( col1,col2,col3)

(7).將取得的結果集回傳給使用者。

從上述流程來看,是否使用檔案排序主要看sort buffer是否能容下需要排序的(id,col2)對,這個buffer的大小由sort_buffer_size參數控制。另外一次排序需要兩次IO,一次是撈(id,col2),第二次是撈(col1,col2,col3),由於返回的結果集合是按col2排序,因此id是亂序的,通過亂序的id去撈(col1,col2,col3)時會產生大量的隨機IO。對於第二次MySQL本身一個最佳化,即在撈之前先將id排序,並放入緩衝區,這個快取區大小由參數read_rnd_buffer_size控制,然後有序去撈記錄,將隨機IO轉為順序IO。

b.優化排序

常規排序方式除了排序本身,還需要額外兩次IO。優化的排序方式相對於常規排序,減少了第二次IO。主要差異在於,放入sort buffer不是(id,col2),而是(col1,col2,col3)。由於sort buffer中包含了查詢需要的所有字段,因此排序完成後可以直接返回,無需二次撈資料。這種方式的代價在於,同樣大小的sort buffer,能存放的(col1,col2,col3)數目要小於(id,col2),如果sort buffer不夠大,可能導致需要寫臨時文件,造成額外的IO。當然MySQL提供了參數max_length_for_sort_data,只有當排序元組小於max_length_for_sort_data時,才能利用最佳化排序方式,否則只能用常規排序方式。

c.優先隊列排序

為了得到最終的排序結果,無論怎樣,我們都需要將所有滿足條件的記錄進行排序才能傳回。那麼相對於優化排序方式,是否還有優化空間呢? 5.6版本針對Order by limit M,N語句,在空間層面做了最佳化,加入了一種新的排序方式--優先隊列,這種方式採用堆排序實作。堆排序演算法特徵正好可以解limit M,N 這類排序的問題,雖然仍然需要所有元素參與排序,但是只需要M N個元組的sort buffer空間即可,對於M,N很小的場景,基本上不會因為sort buffer不夠而導致需要臨時檔案進行歸併排序的問題。對於升序,採用大頂堆,最終堆中的元素組成了最小的N個元素,對於降序,採用小頂堆,最終堆中的元素組成了最大的N的元素。

以上是mysql排序區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

centos安裝mysql centos安裝mysql Apr 14, 2025 pm 08:09 PM

在 CentOS 上安裝 MySQL 涉及以下步驟:添加合適的 MySQL yum 源。執行 yum install mysql-server 命令以安裝 MySQL 服務器。使用 mysql_secure_installation 命令進行安全設置,例如設置 root 用戶密碼。根據需要自定義 MySQL 配置文件。調整 MySQL 參數和優化數據庫以提升性能。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

See all articles