mysql織夢(mèng)索引優(yōu)化之MySQL Order By索引優(yōu)化

在一些情況下,MySQL可以直接使用索引來滿足一個(gè)ORDER BY 或GROUP BY 子句而無需做額外的排序。盡管ORDER BY 不是和索引的順序準(zhǔn)確匹配,索引還是可以被用到,只要不用的索引部分和所有的額外的ORDER BY 字段在WHERE 子句中都被包括了。
使用索引的MySQL Order By
下列的幾個(gè)查詢都會(huì)使用索引來解決ORDER BY 或GROUP BY 部分:
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;
SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;
SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2;
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
不使用索引的MySQL Order By
在另一些情況下,MySQL無法使用索引來滿足ORDER BY,盡管它會(huì)使用索引來找到記錄來匹配WHERE 子句。這些情況如下:
* 對(duì)不同的索引鍵做ORDER BY :
SELECT * FROM t1 ORDER BY key1, key2;
* 在非連續(xù)的索引鍵部分上做ORDER BY:
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;
* 同時(shí)使用了ASC 和DESC:
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
* 用于搜索記錄的索引鍵和做ORDER BY 的不是同一個(gè):
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
* 有很多表一起做連接,而且讀取的記錄中在ORDER BY 中的字段都不全是來自第一個(gè)非常數(shù)的表中(也就是說,在EXPLAIN 分析的結(jié)果中的第一個(gè)表的連接類型不是const)。
* 使用了不同的ORDER BY 和GROUP BY 表達(dá)式。
* 表索引中的記錄不是按序存儲(chǔ)。例如,HASH 和HEAP 表就是這樣。
通過執(zhí)行EXPLAIN SELECT ... ORDER BY,就知道MySQL是否在查詢中使用了索引。如果Extra 字段的值是Using filesort,則說明MySQL無法使用索引。詳情請(qǐng)看"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。當(dāng)必須對(duì)結(jié)果進(jìn)行排序時(shí),MySQL 4.1以前 它使用了以下filesort 算法:
1. 根據(jù)索引鍵讀取記錄,或者掃描數(shù)據(jù)表。那些無法匹配WHERE 分句的記錄都會(huì)被略過。
2. 在緩沖中每條記錄都用一個(gè)‘對(duì)’存儲(chǔ)了2個(gè)值(索引鍵及記錄指針)。緩沖的大小依據(jù)系統(tǒng)變量sort_buffer_size 的值而定。
3. 當(dāng)緩沖慢了時(shí),就運(yùn)行qsort(快速排序)并將結(jié)果存儲(chǔ)在臨時(shí)文件中。將存儲(chǔ)的塊指針保存起來(如果所有的‘對(duì)’值都能保存在緩沖中,就無需創(chuàng)建臨時(shí)文件了)。
4. 執(zhí)行上面的操作,直到所有的記錄都讀取出來了。
5. 做一次多重合并,將多達(dá)MERGEBUFF(7)個(gè)區(qū)域的塊保存在另一個(gè)臨時(shí)文件中。重復(fù)這個(gè)操作,直到所有在第一個(gè)文件的塊都放到第二個(gè)文件了。
6. 重復(fù)以上操作,直到剩余的塊數(shù)量小于MERGEBUFF2 (15)。
7. 在最后一次多重合并時(shí),只有記錄的指針(排序索引鍵的最后部分)寫到結(jié)果文件中去。
8. 通過讀取結(jié)果文件中的記錄指針來按序讀取記錄。想要優(yōu)化這個(gè)操作,MySQL將記錄指針讀取放到一個(gè)大的塊里,并且使用它來按序讀取記錄,將記錄放到緩沖中。緩沖的大小由系統(tǒng)變量read_rnd_buffer_size 的值而定。這個(gè)步驟的代碼在源文件`sql/records.cc' 中。
這個(gè)逼近算法的一個(gè)問題是,讀取了2次記錄:一次是估算WHERE 分句時(shí),第二次是排序時(shí)。盡管第一次都成功讀取記錄了(例如,做了一次全表掃描),第二次是隨機(jī)的讀取(索引鍵已經(jīng)排好序了,但是記錄并沒有)。在MySQL 4.1 及更新版本中,filesort 優(yōu)化算法用于記錄中不只包括索引鍵值和記錄的位置,還包括查詢中要求的字段。這么做避免了需要2次讀取記錄。改進(jìn)的filesort 算法做法大致如下:
1. 跟以前一樣,讀取匹配WHERE 分句的記錄。
2. 相對(duì)于每個(gè)記錄,都記錄了一個(gè)對(duì)應(yīng)的;‘元組’信息信息,包括索引鍵值、記錄位置、以及查詢中所需要的所有字段。
3. 根據(jù)索引鍵對(duì)‘元組’信息進(jìn)行排序。
4. 按序讀取記錄,不過是從已經(jīng)排序過的‘元組’列表中讀取記錄,而非從數(shù)據(jù)表中再讀取一次。
使用改進(jìn)后的filesort 算法相比原來的,‘元組’比‘對(duì)’需要占用更長(zhǎng)的空間,它們很少正好適合放在排序緩沖中(緩沖的大小是由sort_buffer_size 的值決定的)。因此,這就可能需要有更多的I/O操作,導(dǎo)致改進(jìn)的算法更慢。為了避免使之變慢,這種優(yōu)化方法只用于排序‘元組’中額外的字段的大小總和超過系統(tǒng)變量max_length_for_sort_data 的情況(這個(gè)變量的值設(shè)置太高的一個(gè)表象就是高磁盤負(fù)載低CPU負(fù)載)。想要提高ORDER BY 的速度,首先要看MySQL能否使用索引而非額外的排序過程。如果不能使用索引,可以試著遵循以下策略:
* 增加sort_buffer_size 的值。
* 增加read_rnd_buffer_size 的值。
* 修改tmpdir,讓它指向一個(gè)有很多剩余空間的專用文件系統(tǒng)。
如果使用MySQL 4.1或更新,這個(gè)選項(xiàng)允許有多個(gè)路徑用循環(huán)的格式。各個(gè)路徑之間在Unix 上用冒號(hào)(':')分隔開來,在Windows,NetWare以及OS/2 上用分號(hào)(';')??梢岳眠@個(gè)特性將負(fù)載平均分?jǐn)偨o幾個(gè)目錄。注意:這些路徑必須是分布在不同物理磁盤上的目錄,而非在同一個(gè)物理磁盤上的不同目錄
相關(guān)文章
織夢(mèng)dedecms安全漏洞include/common.inc.php漏洞解決方法
據(jù)悉DEDECMS的全局變量初始化存在漏洞,可以任意覆蓋任意全局變量,下面是具體的解決方法,需要的朋友可以參考下2021-05-13織夢(mèng)DEDECMS建立模型、簡(jiǎn)單分表、索引優(yōu)化操作方法
最近因?yàn)槭褂玫膁ede系統(tǒng)考慮后期數(shù)據(jù)量大的問題,所以提前將dedecms優(yōu)化一下,應(yīng)對(duì)后期數(shù)據(jù)量大導(dǎo)致后臺(tái)卡等問題,這里為大家分享一下,主要是思路對(duì)于新版本的dedecms需要2021-05-12DedeCMS大數(shù)據(jù)負(fù)載性能優(yōu)化方案(簡(jiǎn)單幾招讓你提速N倍)
今天我們分享一下DedeCMS數(shù)據(jù)負(fù)載性能優(yōu)化的方法,因?yàn)槟壳?0w條記錄,導(dǎo)致站點(diǎn)后臺(tái)查詢慢,生成HTML也很吃力,經(jīng)過下面的優(yōu)化確實(shí)可以提升不少2021-05-12mysql織夢(mèng)索引優(yōu)化之MySQL Order By索引優(yōu)化
最近基于mysql數(shù)據(jù)庫的織夢(mèng)系統(tǒng)查詢與生成靜態(tài)頁面比較慢,所以想優(yōu)化一下索引試試能不能提高一下執(zhí)行效率下面是具體的實(shí)現(xiàn)步驟,需要的朋友可以參考一下2021-05-12織夢(mèng)dedecms頁面空白后開啟錯(cuò)誤信息提示功能方便調(diào)試錯(cuò)誤
織夢(mèng)后臺(tái)空白、織夢(mèng)后臺(tái)左側(cè)空白等相關(guān)問題,如果沒有報(bào)錯(cuò)提示信息,不顯示任何內(nèi)容,對(duì)新手來說摸不著頭腦,無從下手,開啟織夢(mèng)錯(cuò)誤信息提示錯(cuò)誤調(diào)試設(shè)置,讓程序告訴我們2021-05-12織夢(mèng)DedeCMS 分表實(shí)現(xiàn)一個(gè)欄目對(duì)應(yīng)一個(gè)表(圖)
最近考慮用dedecms做個(gè)大數(shù)據(jù)量的網(wǎng)站,為什么用dedecms呢因?yàn)檫@個(gè)系統(tǒng)特別好用,但負(fù)載是軟肋,很多功能只能自己動(dòng)手實(shí)現(xiàn)了,下面就為大家分享一下具體的方法2021-05-12- 這篇文章主要介紹了加固版織夢(mèng)CMS整站源碼通用安裝教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-17
織夢(mèng)DEDECMS robots優(yōu)化設(shè)置的具體方法
這篇文章主要介紹了織夢(mèng)DEDECMS robots優(yōu)化設(shè)置的具體方法,DEDECMS自帶的robots.txt文件設(shè)置很簡(jiǎn)單,并不能完全滿足網(wǎng)站的優(yōu)化要求,需要的朋友可以參考下本篇方法2020-12-02Dedecms網(wǎng)站Title標(biāo)簽SEO優(yōu)化方法
這篇文章主要介紹了Dedecms網(wǎng)站Title標(biāo)簽SEO優(yōu)化方法,主要涉及到如何實(shí)現(xiàn)"三級(jí)欄目_二級(jí)欄目_一級(jí)欄目_網(wǎng)站名稱"的問題,需要的朋友可以參考下小編的方法2020-12-02dedecms文章關(guān)鍵字(自動(dòng)內(nèi)鏈)php5.5以上版本urf-8失效的解決方法
這篇文章主要為大家詳細(xì)介紹了dedecms文章關(guān)鍵字(自動(dòng)內(nèi)鏈)php5.5以上版本urf-8失效的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,有需要的朋友可以收藏2020-11-18