欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL簡單了解“order by”是怎么工作的

 更新時間:2019年05月21日 14:22:28   作者:piperck  
在MySQl中ORDER BY 語句用于對結果集進行排序,那么它是怎么工作的,以及如何優(yōu)化,下面由小編跟大家講一講

針對排序來說,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;

這時我們寫一條查詢語句

select city,name,age from t where city='杭州' order by name limit 1000 ;

根據(jù)上面的表定義來看,city=xxx 可以使用到我們定義的一個索引。但是 order by name 明顯我們沒有索引,所以肯定需要先用索引查詢到 city=xxx 然后再進行回表查詢,最后再排序。

全字段排序

在 city 字段上面創(chuàng)建索引之后,我們使用執(zhí)行計劃來查看這個語句

可以看到有索引的情況下 我們這里還是使用了 "Using filesort" 表示需要排序,MySQL 會給每個線程分配一塊內(nèi)存用于排序 稱為 sort_buffer。

我們在執(zhí)行上面 select 語句的時候通常經(jīng)歷了這樣一個過程

1. 初始化 sort_buffer, 確認放入 name, city, age 這三個字段。

2. 從索引 city 找到第一個滿足 city='杭州'條件的主鍵 id。

3. 回表取到 name, city, age 三個字段值,存入 sort_buffer 中。

4. 從索引 city 取下一個主鍵 id 記錄。

5. 重復 3-4 步驟,直到 city 不滿足條件。

6. 對 sort_buffer 中的數(shù)據(jù)按照字段 name 做快速排序。

7. 排序結果取前 1000 行返回給客戶端。

這被我們稱為全字段排序。

按照 name 排序這個動作即可能在內(nèi)存中完成,也可以能使用外部文件排序。這取決于 sort_buffer_size 。sort_buffer_size 的默認值是1048576 byte 也就是 1M,如果要排序的數(shù)據(jù)量小于 1m 排序就在內(nèi)存中完成,如果排序數(shù)據(jù)量大,內(nèi)存放不下,則使用磁盤臨時文件輔助排序。

Rowid 排序

如果單行很大,需要的字段全部放進 sort_buffer 效果就不會很好。

MySQL 中專門用于控制排序的行數(shù)據(jù)長度有個參數(shù) max_length_for_sort_data 默認是1024,如果超過了這個值就會使用 rowid 排序。那么執(zhí)行上面語句的流程就變成了

1. 初始化 sort_buffe 確定放入兩個字段即 name 和 id 。

2. 從索引 city 找到第一個滿足 city = '杭州'條件的主鍵 id。

3. 回表取 name 和 id 兩個字段 存入 sort_buffer 中。

4. 取下個滿足條件的記錄 重復 2 3 步驟。

5. 對 sort_buffer 中的 name 進行排序。

6.遍歷結果取前 1000 行。然后按照 id 再回一次表取的結果字段返回給客戶端。

其實并不是所有 oder by 語句都需要進行上面的二次排序操作。從上面分析的執(zhí)行過程,我們可以注意到。MySQL 之所以需要生成臨時表,是因為要在臨時表上做排序,是因為之前我們?nèi)〉玫氖菙?shù)據(jù)是無序的。

如果我們對剛才的索引修改一下,使得他是一個聯(lián)合索引,那么第二個字段我們拿到的值其實就是有序的了。

聯(lián)合索引滿足這么一個條件,當我們的第一個索引字段是相等的情況下,第二個字段是有序的。

這能保證如果我們建立 (city,name) 索引的話,當我們在搜索 city='杭州'的情況的是時候找到的目標第二個字段 name 其實是有序的。所以查詢過程可以簡化成。

1. 從索引 (city, name) 找到第一個滿足 city = '杭州'條件的主鍵 id 。

2. 回表取到 name city age 三個值返回。

3. 取下一個 id 。

4. 重復2 3 兩個步驟直到 1000 條記錄,或者是不滿足 city = '杭州'條件結束。

也因為查詢過程都可以使用到索引的有序性,所以不再需要排序也不需要時使用 sort buffer 了。

更近一步的優(yōu)化就是之前說過的索引覆蓋,將需要查詢的字段也覆蓋進索引中,再省掉回表的步驟,可以讓整個查詢的速度更快。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MySQL 數(shù)據(jù)備份與還原的示例代碼

    MySQL 數(shù)據(jù)備份與還原的示例代碼

    這篇文章主要介紹了MySQL 數(shù)據(jù)備份與還原的相關知識,本文通過示例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • mysql表分區(qū)的方式和實現(xiàn)代碼示例

    mysql表分區(qū)的方式和實現(xiàn)代碼示例

    通俗地講表分區(qū)是將一個大表,根據(jù)條件分割成若干個小表,下面這篇文章主要給大家介紹了關于mysql表分區(qū)的方式和實現(xiàn)代碼,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Mysql中JDBC的三種查詢(普通、流式、游標)詳解

    Mysql中JDBC的三種查詢(普通、流式、游標)詳解

    這篇文章主要介紹了Mysql中JDBC的三種查詢(普通、流式、游標)詳解,JDBC(Java DataBase Connectivity:java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系型數(shù)據(jù)庫提供統(tǒng)一訪問,它是由一組用Java語言編寫的類和接口組成的,需要的朋友可以參考下
    2023-08-08
  • Mysql設置主鍵自動增長起始值的方案總結

    Mysql設置主鍵自動增長起始值的方案總結

    在MySQL?中,當主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值,下面這篇文章主要給大家介紹了關于Mysql設置主鍵自動增長起始值的相關資料,需要的朋友可以參考下
    2022-09-09
  • Mysql8.0遞歸查詢的簡單用法示例

    Mysql8.0遞歸查詢的簡單用法示例

    在項目中會遇到同一個表中保存著父子關系的數(shù)據(jù),最常見的就是處理樹形結構資源,這篇文章主要給大家介紹了關于Mysql8.0遞歸查詢的簡單用法,需要的朋友可以參考下
    2021-08-08
  • 解決Win10系統(tǒng)安裝MySQL8.0遇到的問題

    解決Win10系統(tǒng)安裝MySQL8.0遇到的問題

    這篇文章主要介紹了Win10系統(tǒng)安裝MySQL8.0遇到的問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2019-12-12
  • MySQL使用GROUP BY分組查詢

    MySQL使用GROUP BY分組查詢

    GROUP BY關鍵字可以根據(jù)一個或多個字段對查詢結果進行分組,本文主要介紹了MySQL使用GROUP BY分組查詢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • MySQL查詢樹形結構數(shù)據(jù)的兩種方法

    MySQL查詢樹形結構數(shù)據(jù)的兩種方法

    本文主要介紹了MySQL查詢樹形結構數(shù)據(jù)的兩種方法,可以使用遞歸查詢或者閉包表來實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Mysql5.7如何修改root密碼

    Mysql5.7如何修改root密碼

    mysql修改管理員root的密碼是個很常見的問題了,網(wǎng)上也有很多的教程,然而新版的MYSQL5.7卻能使用之前的教程,小編經(jīng)過一番摸索,才找到了修改辦法,這里分享給大家。
    2016-01-01
  • 完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    下面小編就為大家?guī)硪黄昝澜鉀QMySQL通過localhost無法連接數(shù)據(jù)庫的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論