MySQL-優(yōu)化order by

索引優(yōu)化排序

InnoDB和MyISAM的數(shù)據(jù)分布對比

了解存儲的數(shù)據(jù)結(jié)構(gòu)有助于理解索引優(yōu)化排序是否有效的場景

MyISAM 按照數(shù)據(jù)插入的順序存儲在磁盤上秦踪。

二級索引:葉子節(jié)點存儲的是行指針

InnoDB支持聚簇索引

聚簇索引: 葉子節(jié)點存儲主鍵值烟零、剩余其他咧蕉堰、事務(wù)id台谢、用于事務(wù)和MVCC的回滾指針张遭。

二級索引(非聚簇索引):葉子節(jié)點存儲的是主鍵值莽龟,并以此作為指向行的“指針”蠕嫁。相比于存儲行指針會占用更多空間,好處是在移動行時不需要去更新二級索引中的這個指針轧房。

InnoDB和MyISAM的索引及數(shù)據(jù)存儲結(jié)構(gòu)

使用索引掃描來排序

在MySQL中拌阴,如果where子句和order by子句符合索引排序的規(guī)則,可以有效避免filesort級別排序(成本高)奶镶。

使用索引解決order by問題的情況

-- 假設(shè)對于tableA存在索引index on (key_part1, key_part2)
CREATE TABLE `tableA` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `key_part1` int(11) DEFAULT NULL,
  `key_part2` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index` (`key_part1`,`key_part2`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

-- 所有的列排序方向一致時(結(jié)合索引的數(shù)據(jù)結(jié)構(gòu)B-Tree理解)才能使用索引排序
SELECT key_part1, key_part2 FROM tableA
  ORDER BY key_part1 DESC, key_part2 DESC;
-- 同為正序
SELECT key_part1, key_part2 FROM tableA
  ORDER BY key_part1 ASC, key_part2 ASC;

-- 因為主鍵(一般是id)存在二級索引的葉子節(jié)點中,索引select的字段中默認(rèn)支持包含主鍵
SELECT id, key_part1, key_part2 FROM tableA
  ORDER BY key_part1, key_part2;

-- 即使order by中不符合前綴索引規(guī)范陪拘,但是其余前置的索引列在where子句中定義了常量厂镇,也會使用索引排序
SELECT key_part1,key_part2 FROM tableA
  WHERE key_part1 = 23
  ORDER BY key_part2;

不會使用索引解決排序問題的情況

以下樣例在執(zhí)行計劃中type仍然可能為index左刽,但是可以在extra下發(fā)現(xiàn)using filesort捺信,實際并沒有做到索引優(yōu)化排序

-- 使用兩個索引
SELECT * FROM t1 ORDER BY key1, key2;

-- order by 子句用了不連續(xù)的索引字段(但是如果where子句中能定義有中間列的常數(shù),也會使用索引排序)
SELECT id, key_part1, key_part2 FROM tableA
  ORDER BY key_part1, key_part3;
  
-- 索引列排序順序不同
SELECT key_part1, key_part2 FROM tableA
  ORDER BY key_part1 DESC, key_part2 ASC;
  
-- 索引列排序順序不同
SELECT key_part1, key_part2 FROM tableA
  ORDER BY key_part1 DESC, key_part2 ASC;
  
-- where條件和order by對應(yīng)的索引不同
SELECT * FROM tableA
    WHERE key1 = constant
  ORDER BY key2;
  
-- order by中需要使用完整字段, 下例不可用索引排序
SELECT key_part1, key_part2 FROM tableA
  ORDER BY key_part1 , right(key_part2, 3);
  
-- 不能使用加工過的數(shù)據(jù)
SELECT ABS(key_part1) AS b FROM t1 ORDER BY b;
  
其它情況:
  1. 索引不支持存儲數(shù)據(jù)行本身欠痴,例如Memory引擎的hash索引迄靠。
  2. order by和group by的表達(dá)式不同。
  3. 如果是多表join的查詢喇辽,order by條件不全是第一個非常數(shù)表的字段掌挚,將無法使用索引排序。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菩咨,一起剝皮案震驚了整個濱河市吠式,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抽米,老刑警劉巖特占,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異云茸,居然都是意外死亡是目,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門标捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懊纳,“玉大人揉抵,你說我怎么就攤上這事〕び唬” “怎么了功舀?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長身弊。 經(jīng)常有香客問我辟汰,道長,這世上最難降的妖魔是什么阱佛? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任帖汞,我火速辦了婚禮,結(jié)果婚禮上凑术,老公的妹妹穿的比我還像新娘翩蘸。我一直安慰自己,他們只是感情好淮逊,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布催首。 她就那樣靜靜地躺著,像睡著了一般泄鹏。 火紅的嫁衣襯著肌膚如雪郎任。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天备籽,我揣著相機(jī)與錄音舶治,去河邊找鬼。 笑死车猬,一個胖子當(dāng)著我的面吹牛霉猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播珠闰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惜浅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铸磅?” 一聲冷哼從身側(cè)響起赡矢,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阅仔,沒想到半個月后吹散,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡八酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年空民,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡界轩,死狀恐怖画饥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浊猾,我是刑警寧澤抖甘,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站葫慎,受9級特大地震影響衔彻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偷办,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一艰额、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椒涯,春花似錦柄沮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湖苞,卻和暖如春棕硫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袒啼。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纬纪,地道東北人蚓再。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像包各,于是被迫代替她去往敵國和親摘仅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359