在mysql中,相關的複製的sql語句,會對所要搜取得結果進行規整,這裡就有排序,分組,統計等相關整理過程,其中排序的演算法的意義最為重要,在mysql不同的版本中,特別是在5.1系列以後對排序演算法的定義不斷加強改善;
在排序演算法中對新舊演算法當中提到的陣列的寬度,以及函數搜取的範圍,大小,影響的高度等都進行了修改,並設定相關的閥值,以指導相關的參數自動閉合;以下是在5.5系列中相關的sort檔案截取;
#define UT_SORT_FUNCTION_BODY(SORT_FUN, ARR, AUX_ARR, LOW, HIGH, CMP_FUN)\{\ulintut_sort_mid77;\ulintut_sort_i77;\ulintut_sort_low77;\ulintut_sort_high77;\\ut_ad((LOW) < (HIGH));\ut_ad(ARR);\ut_ad(AUX_ARR);\\if ((LOW) == (HIGH) - 1) {\return;\} else if ((LOW) == (HIGH) - 2) {\if (CMP_FUN((ARR)[LOW], (ARR)[(HIGH) - 1]) > 0) {\(AUX_ARR)[LOW] = (ARR)[LOW];\(ARR)[LOW] = (ARR)[(HIGH) - 1];\(ARR)[(HIGH) - 1] = (AUX_ARR)[LOW];\}\return;\}\\ut_sort_mid77 = ((LOW) + (HIGH)) / 2;\\SORT_FUN((ARR), (AUX_ARR), (LOW), ut_sort_mid77);\SORT_FUN((ARR), (AUX_ARR), ut_sort_mid77, (HIGH));\\ut_sort_low77 = (LOW);\ut_sort_high77 = ut_sort_mid77;\\for (ut_sort_i77 = (LOW); ut_sort_i77 < (HIGH); ut_sort_i77++) {\\if (ut_sort_low77 >= ut_sort_mid77) {\(AUX_ARR)[ut_sort_i77] = (ARR)[ut_sort_high77];\ut_sort_high77++;\} else if (ut_sort_high77 >= (HIGH)) {\(AUX_ARR)[ut_sort_i77] = (ARR)[ut_sort_low77];\ut_sort_low77++;\} else if (CMP_FUN((ARR)[ut_sort_low77],\ (ARR)[ut_sort_high77]) > 0) {\(AUX_ARR)[ut_sort_i77] = (ARR)[ut_sort_high77];\ut_sort_high77++;\} else {\(AUX_ARR)[ut_sort_i77] = (ARR)[ut_sort_low77];\ut_sort_low77++;\}\}\\memcpy((void*) ((ARR) + (LOW)), (AUX_ARR) + (LOW),\ ((HIGH) - (LOW)) * sizeof *(ARR));\}\
參數max_length_for_sort_data;
在MySQL中,決定使用第一種老式的排序演算法還是新的改進演算法的依據是通過參數max_length_for_sort_data來決定的。當我們所有返回欄位的最大長度小於這個參數值的時候,MySQL就會選擇改進後的排序演算法,反之,則選擇老式的演算法。所以,如果我們有充足的記憶體讓MySQL存放需要返回的非排序欄位的時候,可以加大這個參數的值來讓MySQL選擇使用改進版的排序演算法。
參數sort_buffer_size;
增大sort_buffer_size並不是為了讓MySQL可以選擇改進版的排序演算法,而是為了讓MySQL可以盡量減少在排序過程中對需要排序的資料進行分段,因為這樣會造成MySQL不得不使用暫存資料表來進行交換排序。
還有就是對相關的欄位進行規避;選擇返回需要的即可;