成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > MySQL排序原理和案例詳析

MySQL排序原理和案例詳析

熱門標簽:云南語音外呼系統(tǒng)平臺 福州呼叫中心外呼系統(tǒng)哪家好 沃克斯電梯外呼線路圖 常州電銷外呼系統(tǒng)一般多少錢 北京人工外呼系統(tǒng)價錢 400電話鄭州申請 房產(chǎn)智能外呼系統(tǒng)品牌 天智外呼系統(tǒng) 地圖標注被騙三百怎么辦

前言

排序是數(shù)據(jù)庫中的一個基本功能,MySQL也不例外。用戶通過Order by語句即能達到將指定的結(jié)果集排序的目的,其實不僅僅是Order by語句,Group by語句,Distinct語句都會隱含使用排序。本文首先會簡單介紹SQL如何利用索引避免排序代價,然后會介紹MySQL實現(xiàn)排序的內(nèi)部原理,并介紹與排序相關(guān)的參數(shù),最后會給出幾個“奇怪”排序例子,來談?wù)勁判蛞恢滦詥栴},并說明產(chǎn)生現(xiàn)象的本質(zhì)原因。

1.排序優(yōu)化與索引使用

為了優(yōu)化SQL語句的排序性能,最好的情況是避免排序,合理利用索引是一個不錯的方法。因為索引本身也是有序的,如果在需要排序的字段上面建立了合適的索引,那么就可以跳過排序的過程,提高SQL的查詢速度。下面我通過一些典型的SQL來說明哪些SQL可以利用索引減少排序,哪些SQL不能。假設(shè)t1表存在索引key1(key_part1,key_part2),key2(key2)

a.可以利用索引避免排序的SQL

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 ORDER BY key_part1 ASC;
SELECT * FROM t1 WHERE key_part1 = constant1 AND key_part2 > constant2 ORDER BY key_part2;

b.不能利用索引避免排序的SQL

//排序字段在多個索引中,無法使用索引排序
SELECT * FROM t1 ORDER BY key_part1,key_part2, key2;
 
//排序鍵順序與索引中列順序不一致,無法使用索引排序
SELECT * FROM t1 ORDER BY key_part2, key_part1;
 
//升降序不一致,無法使用索引排序
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
 
//key_part1是范圍查詢,key_part2無法使用索引排序
SELECT * FROM t1 WHERE key_part1> constant ORDER BY key_part2;

2.排序?qū)崿F(xiàn)的算法

對于不能利用索引避免排序的SQL,數(shù)據(jù)庫不得不自己實現(xiàn)排序功能以滿足用戶需求,此時SQL的執(zhí)行計劃中會出現(xiàn)“Using filesort”,這里需要注意的是filesort并不意味著就是文件排序,其實也有可能是內(nèi)存排序,這個主要由sort_buffer_size參數(shù)與結(jié)果集大小確定。MySQL內(nèi)部實現(xiàn)排序主要有3種方式,常規(guī)排序,優(yōu)化排序和優(yōu)先隊列排序,主要涉及3種排序算法:快速排序、歸并排序和堆排序。假設(shè)表結(jié)構(gòu)和SQL語句如下:

CREATE TABLE t1(id int, col1 varchar(64), col2 varchar(64), col3 varchar(64), PRIMARY KEY(id),key(col1,col2));
SELECT col1,col2,col3 FROM t1 WHERE col1>100 ORDER BY col2;

a.常規(guī)排序

(1).從表t1中獲取滿足WHERE條件的記錄

(2).對于每條記錄,將記錄的主鍵+排序鍵(id,col2)取出放入sort buffer

(3).如果sort buffer可以存放所有滿足條件的(id,col2)對,則進行排序;否則sort buffer滿后,進行排序并固化到臨時文件中。(排序算法采用的是快速排序算法)

(4).若排序中產(chǎn)生了臨時文件,需要利用歸并排序算法,保證臨時文件中記錄是有序的

(5).循環(huán)執(zhí)行上述過程,直到所有滿足條件的記錄全部參與排序

(6).掃描排好序的(id,col2)對,并利用id去撈取SELECT需要返回的列(col1,col2,col3)

(7).將獲取的結(jié)果集返回給用戶。

從上述流程來看,是否使用文件排序主要看sort buffer是否能容下需要排序的(id,col2)對,這個buffer的大小由sort_buffer_size參數(shù)控制。此外一次排序需要兩次IO,一次是撈(id,col2),第二次是撈(col1,col2,col3),由于返回的結(jié)果集是按col2排序,因此id是亂序的,通過亂序的id去撈(col1,col2,col3)時會產(chǎn)生大量的隨機IO。對于第二次MySQL本身一個優(yōu)化,即在撈之前首先將id排序,并放入緩沖區(qū),這個緩存區(qū)大小由參數(shù)read_rnd_buffer_size控制,然后有序去撈記錄,將隨機IO轉(zhuǎn)為順序IO。

b.優(yōu)化排序

常規(guī)排序方式除了排序本身,還需要額外兩次IO。優(yōu)化的排序方式相對于常規(guī)排序,減少了第二次IO。主要區(qū)別在于,放入sort buffer不是(id,col2),而是(col1,col2,col3)。由于sort buffer中包含了查詢需要的所有字段,因此排序完成后可以直接返回,無需二次撈數(shù)據(jù)。這種方式的代價在于,同樣大小的sort buffer,能存放的(col1,col2,col3)數(shù)目要小于(id,col2),如果sort buffer不夠大,可能導(dǎo)致需要寫臨時文件,造成額外的IO。當然MySQL提供了參數(shù)max_length_for_sort_data,只有當排序元組小于max_length_for_sort_data時,才能利用優(yōu)化排序方式,否則只能用常規(guī)排序方式。

c.優(yōu)先隊列排序

為了得到最終的排序結(jié)果,無論怎樣,我們都需要將所有滿足條件的記錄進行排序才能返回。那么相對于優(yōu)化排序方式,是否還有優(yōu)化空間呢?5.6版本針對Order by limit M,N語句,在空間層面做了優(yōu)化,加入了一種新的排序方式--優(yōu)先隊列,這種方式采用堆排序?qū)崿F(xiàn)。堆排序算法特征正好可以解limit M,N 這類排序的問題,雖然仍然需要所有元素參與排序,但是只需要M+N個元組的sort buffer空間即可,對于M,N很小的場景,基本不會因為sort buffer不夠而導(dǎo)致需要臨時文件進行歸并排序的問題。對于升序,采用大頂堆,最終堆中的元素組成了最小的N個元素,對于降序,采用小頂堆,最終堆中的元素組成了最大的N的元素。

3.排序不一致問題

案例1

Mysql從5.5遷移到5.6以后,發(fā)現(xiàn)分頁出現(xiàn)了重復(fù)值。

測試表與數(shù)據(jù):

create table t1(id int primary key, c1 int, c2 varchar(128));
insert into t1 values(1,1,'a');
insert into t1 values(2,2,'b');
insert into t1 values(3,2,'c');
insert into t1 values(4,2,'d');
insert into t1 values(5,3,'e');
insert into t1 values(6,4,'f');
insert into t1 values(7,5,'g');

假設(shè)每頁3條記錄,第一頁limit 0,3和第二頁limit 3,3查詢結(jié)果如下:

我們可以看到 id為4的這條記錄居然同時出現(xiàn)在兩次查詢中,這明顯是不符合預(yù)期的,而且在5.5版本中沒有這個問題。產(chǎn)生這個現(xiàn)象的原因就是5.6針對limit M,N的語句采用了優(yōu)先隊列,而優(yōu)先隊列采用堆實現(xiàn),比如上述的例子order by c1 asc limit 0,3 需要采用大小為3的大頂堆;limit 3,3需要采用大小為6的大頂堆。由于c1為2的記錄有3條,而堆排序是非穩(wěn)定的(對于相同的key值,無法保證排序后與排序前的位置一致),所以導(dǎo)致分頁重復(fù)的現(xiàn)象。為了避免這個問題,我們可以在排序中加上唯一值,比如主鍵id,這樣由于id是唯一的,確保參與排序的key值不相同。將SQL寫成如下:

select * from t1 order by c1,id asc limit 0,3;
select * from t1 order by c1,id asc limit 3,3;

案例2

兩個類似的查詢語句,除了返回列不同,其它都相同,但排序的結(jié)果不一致。

測試表與數(shù)據(jù):

create table t2(id int primary key, status int, c1 varchar(255),c2 varchar(255),c3 varchar(255),key(c1));
insert into t2 values(7,1,'a',repeat('a',255),repeat('a',255));
insert into t2 values(6,2,'b',repeat('a',255),repeat('a',255));
insert into t2 values(5,2,'c',repeat('a',255),repeat('a',255));
insert into t2 values(4,2,'a',repeat('a',255),repeat('a',255));
insert into t2 values(3,3,'b',repeat('a',255),repeat('a',255));
insert into t2 values(2,4,'c',repeat('a',255),repeat('a',255));
insert into t2 values(1,5,'a',repeat('a',255),repeat('a',255));

分別執(zhí)行SQL語句:

select id,status,c1,c2 from t2 force index(c1) where c1>='b' order by status;
select id,status from t2 force index(c1) where c1>='b' order by status;

執(zhí)行結(jié)果如下:

看看兩者的執(zhí)行計劃是否相同

為了說明問題,我在語句中加了force index的hint,確保能走上c1列索引。語句通過c1列索引撈取id,然后去表中撈取返回的列。根據(jù)c1列值的大小,記錄在c1索引中的相對位置如下:

(c1,id)===(b,6),(b,3),(5,c),(c,2),對應(yīng)的status值分別為2 3 2 4。從表中撈取數(shù)據(jù)并按status排序,則相對位置變?yōu)?6,2,b),(5,2,c),(3,3,c),(2,4,c),這就是第二條語句查詢返回的結(jié)果,那么為什么第一條查詢語句(6,2,b),(5,2,c)是調(diào)換順序的呢?這里要看我之前提到的a.常規(guī)排序和b.優(yōu)化排序中標紅的部分,就可以明白原因了。由于第一條查詢返回的列的字節(jié)數(shù)超過了max_length_for_sort_data,導(dǎo)致排序采用的是常規(guī)排序,而在這種情況下MYSQL將rowid排序,將隨機IO轉(zhuǎn)為順序IO,所以返回的是5在前,6在后;而第二條查詢采用的是優(yōu)化排序,沒有第二次撈取數(shù)據(jù)的過程,保持了排序后記錄的相對位置。對于第一條語句,若想采用優(yōu)化排序,我們將max_length_for_sort_data設(shè)置調(diào)大即可,比如2048。

4.參考文檔

  • http://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html
  • http://mysql.taobao.org/monthly/2015/06/04/
  • http://ifxoxo.com/mysql_order_by.html

到此這篇關(guān)于MySQL排序原理和案例詳析的文章就介紹到這了,更多相關(guān)MySQL排序原理和案例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL 查詢的排序、分頁相關(guān)
  • MySQL利用索引優(yōu)化ORDER BY排序語句的方法
  • Mysql排序和分頁(order by&limit)及存在的坑
  • MySQL如何使用union all獲得并集排序
  • Mysql8.0使用窗口函數(shù)解決排序問題
  • MySQL單表查詢操作實例詳解【語法、約束、分組、聚合、過濾、排序等】
  • 基于mysql 默認排序規(guī)則的坑

標簽:鹽城 沈陽 徐州 黔東 移動 珠海 拉薩 沈陽

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL排序原理和案例詳析》,本文關(guān)鍵詞  MySQL,排序,原理,和,案例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL排序原理和案例詳析》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL排序原理和案例詳析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    成 年 人 黄 色 大 片大 全| 波多野结衣a v在线| 老司机免费视频久久| 欧美一区二区三区图| 国产一区二区三区免费不卡| 国产原创av在线| 免费在线观看不卡| 欧美日韩综合高清一区二区| 欧美变态视频| 国产精品福利在线观看网址| 欧美一卡二卡在线| 欧美日本精品| 欧美视频小说| 亚洲深夜影院| 99久久久久久久久| 激情婷婷综合网| 精品成人无码一区二区三区| 成人av在线影院| 91中文字幕精品永久在线| 999视频精品| 午夜激情在线观看视频| 美女扒开尿口让男人操亚洲视频网站| 国产资源在线观看入口av| 波多野结衣中文字幕在线播放| 97偷自拍亚洲综合二区| 亚洲三区在线播放| www.日日操| 一区二区三区四区| 免费观看h片| 97涩在线观看视频| 97激碰免费视频| 精品国产伦一区二区三区观看方式| 欧美中文字幕视频| 国产精品一区二区精品视频观看| 色爱综合av| 欧美性色黄在线视频| 九九热99视频| 国产精品亚洲视频在线观看| 久久久久久久久久久久网站| 日韩电影在线一区二区| 成人精品一区二区三区电影黑人| 精品视频在线观看日韩| 这里只有精品99re| 日本亚洲欧美美色| 澳门黄色一级片| 色综合色综合久久综合频道88| 亚洲熟女少妇一区二区| 欧美拍拍视频| 日本久久免费| 久久久久久免费毛片精品| 久久在线精品| 欧美成人福利在线观看| 热三久草你在线| 亚洲国产精品嫩草影院久久| 免费成人在线观看av| 激情六月丁香| 91福利区一区二区三区| 欧美三级在线免费观看| 亚洲国产一区二区三区高清| 亚洲国产日韩成人综合天堂| 欧美成人中文字幕在线| 高清一区在线观看| 久久99精品国产自在现线小黄鸭| 国产精品午夜免费| 久久久久久久久免费看无码| 超碰97人人在线| 丁香久久综合| 网爆门在线观看| 黑人巨大xxx| 91香蕉视频导航| 人体久久天天| 日韩欧美一级片| 色的视频在线观看免费播放| 久久视频在线播放| 成人免费观看男女羞羞视频| 亚洲欧美日韩国产综合在线| 亚洲国产女人aaa毛片在线| 欧美中文字幕在线| 视频免费1区二区三区| 黄色片一级视频| 五月婷婷激情视频| 久久精品综合视频| 色噜噜偷拍精品综合在线| 欧美日本在线视频中文字字幕| 人人妻人人添人人爽欧美一区| av电影中文字幕| 亚洲三级久久久| 国产高潮失禁喷水爽到抽搐| 久久久无码中文字幕久...| 国产麻豆视频精品| 国产精品久久久久免费a∨大胸| 国产成人啪精品午夜在线观看| 再深点灬舒服灬太大了添少妇视频| 国产精品果冻传媒| 亚洲第一激情av| 国产精品偷伦视频免费观看了| 九草视频在线观看| 激情深爱综合网| 先锋影音男人| 美女视频久久| 国产亚洲欧美一区二区三区| 精油按摩中文字幕久久| 日韩欧美综合视频| 91麻豆国产在线观看| 毛片网站在线| 欧美freesex黑人又粗又大| 日韩精品一级中文字幕精品视频免费观看| 成人小视频免费观看| 中文字幕精品—区二区四季| 真实国产乱子伦精品一区二区三区| 亚洲色图 在线视频| 欧美一区二区三区四区夜夜大片| 亚洲精品国产精品乱码不99| 少妇与大狼拘作爱性a| 中文字幕精品在线视频| 神马影院午夜我不卡| 亚洲巨乳在线观看| 性欧美13一14内谢| 国产精品久久久对白| 激情四射综合网| 亚洲欧美自拍一区| 午夜精品久久久久久久99热浪潮| 69av在线播放| 美女国内精品自产拍在线播放| 国产在线观看av| 国产福利在线播放| 香蕉久久精品日日躁夜夜躁| 亚洲做受高潮无遮挡| aaaaa一级片| 美国毛片一区二区| 日本免费一区视频| 九色精品美女在线| 亚洲va欧美va国产综合剧情| 香蕉综合视频| 在线视频国产三级| 国产精品12| 国产精品一区二区三区四区在线观看| 在线免费精品视频| 亚洲午夜无码av毛片久久| 久久精品视频导航| 亚洲人成77777| 日韩精品首页| 香蕉视频网站在线观看| 日本高清视频一区| 欧美一级艳片视频免费观看| 精品国产鲁一鲁一区二区张丽| 成人中文字幕视频| 日本中文字幕有码| 羞羞答答一区二区| 国产69精品久久久久9999| 亚洲成人tv网| 999精品在线观看| 精品人妻伦九区久久aaa片| 韩国精品免费视频| 久久91精品国产91久久久| 久久久噜噜噜久久狠狠50岁| 韩国日本不卡在线| 国产激情在线观看视频| 阿v免费在线观看| 欧美午夜性春猛xxxx| 北条麻妃在线| 99香蕉国产精品偷在线观看| 国产白袜脚足j棉袜在线观看| 亚洲九九九在线观看| 美女网站视频在线| 国产综合网站| 欧美xxx久久| www.久久久久久.com| 风间由美中文字幕在线看视频国产欧美| 亚洲精一区二区三区| 国产精品白嫩白嫩大学美女| 国产精品一品二区三区的使用体验| 幼a在线观看| 伊人久久综合视频| 好好的日comwww| 国产精品精品视频一区二区三区| 羞羞视频在线观看| 神马久久影视大全| 91精品久久久久久久久久久| 欧美日韩一区视频| 天天爽夜夜爽| 免费a级人成a大片在线观看| 少妇大叫太粗太大爽一区二区| 一本大道久久a久久综合婷婷| 女尊高h男高潮呻吟| 中文字幕一区二区三区中文字幕| 成av人片在线观看www| 国产精品资源网| sese久久| 在线观看日韩www视频免费| 中文字幕在线第一页| 91精品久久香蕉国产线看观看| 92国产精品| 国产成人精品av在线| 黑人巨大40cm重口| 欧美精品一区二区三区蜜桃| 99在线影院| 国产日产亚洲精品系列| 黑森林福利视频导航| 日韩欧美一级在线| a级片在线视频| 波多野结衣激情| 欧美毛片免费观看| 麻豆国产va免费精品高清在线| 香蕉影院在线观看| 国产成人亚洲综合小说区| bt电影在线| 日本免费一区二区六区| 97免费资源站| 国产真人做爰视频免费| 日韩精品视频免费| 欧美日韩亚洲一区二区三区在线观看| 性日韩欧美在线视频| 欧美在线影院在线视频| 一区二区三区在线高清| 亚洲人a成www在线影院| 免费国产黄色网址| 最近2019中文免费高清视频观看www99| 欧美午夜寂寞| 久久久午夜影院| 国产乱码精品一区二区三| 少妇性bbb搡bbb爽爽爽欧美| 国产亚洲一级| 日韩视频亚洲视频| 岛国av在线免费| 欧美人体大胆444www| 精品精品精品| 欧美日韩一道本| 国产精品小仙女| 99视频入口| 麻豆av免费在线观看| 日本学生初尝黑人巨免费视频| 欧美黑人狂野猛交老妇| 一女二男3p波多野结衣| 2021久久精品国产99国产精品| 久久国产福利| 国产免费一区| 尤物yw午夜国产精品视频| 黑人无套内谢中国美女| 午夜性色一区二区三区免费视频| 国产丝袜一区二区| 国产精品人人爱一区二区白浆| 成人免费高清观看| 波多野结衣先锋影音| 国产性xxxx18免费观看视频| 欧美天堂一区二区| 午夜激情成人网| 三上悠亚一区| 亚洲精品99999| 成人毛片免费在线观看| 欧美精品一卡| 亚洲熟女一区二区三区| 久本草在线中文字幕亚洲| 丁香婷婷综合网| 人妻少妇一区二区| yy111111少妇嫩草影院| 青青草成人在线观看| 91精品啪在线观看国产60岁| 亚洲国产精品成人久久综合一区| 福利片在线看| 亚洲视频在线免费看| 亚洲精品日产| 婷婷亚洲天堂| 最近2019免费中文字幕视频三| 性一交一乱一区二区洋洋av| 国产女人18水真多毛片18精品| 2012中文字幕在线视频| 伊人久久成人网| 日日橹狠狠爱欧美超碰| 日日夜夜人人| 最近2019中文字幕在线高清| 久久精品国产欧美亚洲人人爽| 秋霞午夜av一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲国产女人aaa毛片在线| 欧美精品久久96人妻无码| 99久久久精品视频| 亚洲欧美日韩小说| 国产人成精品| 麻豆乱码国产一区二区三区| 日本中文字幕中出在线| 日本激情视频在线| 中文国产字幕在线观看| 蜜桃传媒av| 国产xxx69麻豆国语对白| 丰满少妇大力进入| 国产手机精品在线| 日韩高清人体午夜| h网在线观看| 国产成人精品视频| 天天影视色香欲综合网天天录日日录| |精品福利一区二区三区| 中文字幕日本最新乱码视频| 色婷婷精品久久二区二区蜜臀av| 色悠悠在线视频| 久久久精品人妻一区二区三区| 国产91免费在线观看| 国产 日韩 欧美 成人| 国产精品免费一区二区三区| 666av成人影院在线观看| 一级一片免费视频| 日本激情视频一区二区三区| 久久精品一区二区三区不卡| 免费看美女隐私的视频| 午夜国产一区| 一个人看的日本www的免费视频| 麻豆91精品91久久久的内涵| 亚洲高清免费在线| 免费成人看片| 是的av在线| 久青草国产在线| 韩国无码av片在线观看网站| 久久久久99精品成人片毛片| 国产成人精品免费网站| 超碰在线一区二区三区| 成人免费在线视频网站| 成人信息集中地| 91av视频在线播放| 天天综合网天天综合| 99亚洲男女激情在线观看| 国产在线一区二区三区欧美| 精品国产一区二区三区久久影院| 一级黄色片日本| 国产主播精品在线| 青青操在线观看| 三妻四妾完整版在线观看电视剧| 日韩福利视频一区| 91高清国产|