91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

說說explain中的Using filesort

發布時間:2020-07-23 19:55:47 來源:網絡 閱讀:7280 作者:coveringindex 欄目:MySQL數據庫

有時查看SQL的執行計劃時, 會遇到Using filesort, 如下.

mysql> explain select * from tb1 where col1 = 4 order by col2\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: tb1

         type: ref

possible_keys: idx_col1

          key: idx_col1

      key_len: 4

          ref: const

         rows: 1

        Extra: Using where; Using filesort

1 row in set (0.00 sec)


這個filesort是說, MySQL要多做一次額外的排序, 確切的說是快速排序(Quicksort).



先初步了解下Quicksort排序的概念(From Wikipedia). 

Quicksort is a divide and conquer algorithm. Quicksort first divides a large array into two smaller sub-arrays: the low elements and the high elements. Quicksort can then recursively sort the sub-arrays.


The steps are:

1. Pick an element, called a pivot, from the array.

2. Partitioning: reorder the array so that all elements with values less than the pivot come before the pivot, while all elements with values greater than the pivot come after it (equal values can go either way). After this partitioning, the pivot is in its final position. This is called the partition operation.

3. Recursively apply the above steps to the sub-array of elements with smaller values and separately to the sub-array of elements with greater values.


再看下Python對于其的一個實現.

#!/usr/bin/env python

# -*- coding: utf-8 -*-


from __future__ import print_function


def quicksort(array):

    if len(array) < 2:

        return array

    else:

        pivot = array[0]

        less = [i for i in array[1:] if i <= pivot]

        greater = [i for i in array[1:] if i > pivot]


        return quicksort(less) + [pivot] + quicksort(greater)


print(quicksort([10, 5, 2, 3]))



再回來說filesort, 在MySQL中有the Original, Modified和In-Memory filesort Algorithm 3種實現. 


The Original filesort Algorithm

1. 掃描或根據WHERE條件, 獲取所有記錄.


2. 把每條記錄的sort key和row ID, 即<sort_key, rowid>, 放入sort buffer中. 若sort buffer滿了, 就在內存中進行一次quicksort, 然后將<sort_key, rowid>寫入臨時文件, 并記錄指向指針. 重復該過程, 直到讀取了所有記錄.


3. 進行若干次multi-merge操作, 將所有row ID寫入結果文件.


4. 根據row ID再次獲取記錄.


很容易發現, 上面的步驟1和4, 一共讀取了2遍記錄, 所以也就有了下面的改進實現.


The Modified filesort Algorithm

較Original改變的地方是, 在第2步記錄的是sort key和涉及到的其它列, 即<sort_key, additional_fields>, 不是row ID了. 第3步完成后, 就可得到結果了.


這個算法中<sort_key, additional_fields>占用空間比<sort_key, rowid>要大, 若排序數據量很大的情況下, 會頻繁寫臨時文件, 為了避免其, 引入了max_length_for_sort_data參數.


The In-Memory filesort Algorithm

那么排序數據量比較小的情況下呢, 小到在sort buffer中就可完成排序, 針對這種情況又有了In-Memory filesort. 這時MySQL把sort buffer當成priority queue使用, 避免使用臨時文件.


上面可以看到MySQL已在盡量優化排序了, 也從側面說明其不希望排序的出現, 如最開始的SQL, 建立一個(col1, col2)的聯合索引, 就可以避免排序了, 該原因還要從B+樹索引說起...


若感興趣可關注訂閱號”數據庫最佳實踐”(DBBestPractice).

說說explain中的Using filesort

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平山县| 五台县| 安达市| 民权县| 辉县市| 上林县| 重庆市| 新兴县| 巴楚县| 都兰县| 泗阳县| 东莞市| 隆化县| 沅江市| 巴林左旗| 临邑县| 印江| 霍林郭勒市| 嘉定区| 榕江县| 碌曲县| 庆阳市| 通化市| 石狮市| 商丘市| 商河县| 章丘市| 徐州市| 深水埗区| 前郭尔| 贞丰县| 文山县| 镇康县| 平阴县| 吕梁市| 达孜县| 五河县| 宜兰县| 寿宁县| 安宁市| 靖宇县|