《MySQL——使用聯合索引、覆蓋索引,避免臨時表的排序操作》

聯合索引避免臨時表排序

在上一篇筆記(MySQL——order by邏輯(全字段排序與rowid排序))中,講到查詢語句查詢多個字段的時候使用order by語句實現返回值是有序的,而order by是使用到了臨時表的,會帶來時間和空間損失。
其實使用聯合索引,就可以避免臨時表的排序操作。
只要保證city這個索引上取出來的行天然就是按照name遞增排序的話,就可以不用再排序了。

alter table t add index city_user(city,name);

在這個索引里面,通過樹搜索的方式定位到第一個滿足city = '杭州’的記錄,并且額外確保了,接下來按順序取“下一條記錄”的遍歷過程中,只要city值是杭州,name值一定有序。
查詢流程變為:
1、從索引(city,name)找到第一個滿足city = '杭州’條件的主鍵id;
2、到主鍵id索引取出整行,取name、city、age三個字段值,作為結果集的一部分直接返回
3、從索引(city,name)取下一個記錄主鍵id;
4、重復step2、3直到查到第1000條記錄,或者不滿足city = '杭州’條件時循環結束。

覆蓋索引優化查詢

可以使用覆蓋索引繼續優化查詢的執行流程:
覆蓋索引指,索引上的信息足夠滿足查詢請求,不需要再回到主鍵索引上取數據。
針對select city,name,age from t 這個查詢,可以創建一個city、name和age的聯合索引,對應語句為:

alter table t add index city_user_age(city,name,age);

這時,對于city字段的值相同的行來說,還是按照name字段的值遞增排序。查詢語句的執行流程變為:
1、從索引(city,name,age)找到第一個滿足city = '杭州’條件的記錄,取出其中的city、name和age三個字段值,作為結果集的一部分直接返回
2、從索引(city,name,age)取下一個記錄,同樣取出這三個字段的值,作為結果集的一部分直接返回
3、重復步驟2,直到查到第1000條記錄,或者是不滿足city = '杭州’條件時循環結束。

當然,并不是說每個查詢能用上覆蓋索引,就要把語句中涉及的字段都建上聯合索引。因為索引有維護代價。

思考

假設表里面已經有了city_name(city,name)聯合索引。你需要查詢杭州和蘇州兩個城市中所有市民的名字,并且按名字排序,顯示前100條記錄。

select * from t where city in('杭州','蘇州') order by name limit 100;

這個語句會有排序。因為條件是蘇州或杭州。如果只有一個條件如只有杭州,那么就不需要排序操作。
如果我們需要實現一個在數據庫端不需要排序的方案,可以這么實現:
把這一條語句拆成兩條語句,流程如下:
1、執行select * from t where city = '杭州' order by name limit 100;
(這個語句不需要排序,客戶端用一個長度為100的內存數組A保存結果)
2、執行select * from where city = '蘇州' order by name limit 100;
(相同的方法,結果被存入內存數組B)
3、對AB兩個有序數組采用歸并排序,得到name最小的前100值,這就是我們需要的結果了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377226.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

明源面試

明源面試,筆試題目如下 一、SQL測試題 1 有兩張表 根據給出的SQL語句,寫出返回的行數分別是多少?為了形象直觀的顯示,我給出了sql語句執行結果。 A 學生表 B分數表 新題目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP:盡早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 視覺特效(鼠標懸停時依次顯示圖片)

效果描述: 有幾副圖片,讓他們依次疊加重合。首先顯示第一張圖片。然后鼠標懸停在上面,邊框變化。然后離開,然后第一張淡出,第二張淡入。接著懸停在第二張圖片,邊框變化,然后離開,第二…

《MySQL tips:查詢時,盡量不要對字段進行操作》

維護一個交易系統,交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 建表語句如下: create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼動畫實現

前言 cocos2d-x 中相關部分代碼介紹 背景知識介紹 參考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 簡單3d 模型支持 第一步實現對3d 模型的簡單支持,完成一個CCSprite3D 類 參考CCSprite 類 以及 CCGLProgram 代碼 主要修改 draw 方法。 添加了定點數組…

關于web.config中customErrors節點說明

關于web.config中<customErrors>節點說明 <customErrors>節點用于定義一些自定義錯誤信息的信息。此節點有Mode和defaultRedirect兩個屬性&#xff0c;其中defaultRedirect屬性是一個可選屬性&#xff0c;表示應用程序發生錯誤時重定向到的默認URL&#xff0c;如果…

肯德基收銀系統模式_肯德基的完整形式是什么?

肯德基收銀系統模式肯德基&#xff1a;肯塔基炸雞 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN轉載)

函數的參數不同叫多態&#xff0c;函數的參數類型可以不確定嗎&#xff1f; 函數的返回值只能是一個嗎&#xff1f;函數的返回值可以不確定嗎&#xff1f; 泛型是一種特殊的類型&#xff0c;它把指定類型的工作推遲到客戶端代碼聲明并實例化類或方法的時候進行。 下面是兩個經典…

《MySQL tips:隱式類型轉換與隱式字符編碼轉換對查詢效率的影響》

維護一個交易系統&#xff0c;交易記錄表tradelog包含交易流水號(tradeid)、交易員id(operator)、交易時間(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…

HDU4291 A Short problem

求通項和斐波那契數列的方法一樣&#xff0c;矩陣快速冪。 這道題麻煩在套了三層。 但其實取模這種操作肯定會出現循環的&#xff0c;可以先本地暴出循環節&#xff0c;1000000007對應的循環節是222222224&#xff0c;222222224對應的循環節是183120。 最外層的結果是對1000000…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR&#xff1a;Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的縮寫 。 它是印度最大和領先的多元…

《MySQL——查詢長時間不返回的三種原因與查詢慢的原因》

目錄查詢長時間不返回等MDL鎖等flush等行鎖查詢慢構造一張表&#xff0c;表有兩個字段id和c&#xff0c;再里面插入了10萬行記錄 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

Linux 命令積累 fuser lsof mtr

fuser 用途:使用文件或文件結構識別進程,即:查詢都有哪些進程占用了制定的文件、目錄、設備或套接字;lsof MTR fuser命令 用途:使用文件或文件結構識別進程,即:查詢都有哪些進程占用了制定的文件、目錄、設備或套接字;語法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目錄…

線程終止問題

http://topic.csdn.net/u/20080429/09/9cfe5204-20b5-40fb-ac12-afdc1e4939e9.html?590511460 線程終止問題 http://blog.csdn.net/wuyazhe/article/details/1771470 帶有消息機制的線程 - CustomMessageQueue(c#) using System; using System.Collections.Generic; using Sy…

HTH的完整形式是什么?

HTH&#xff1a;希望這個(那個)有幫助 (HTH: Hope This (That) Helps) HTH is an abbreviation of "Hope This (That) Helps". HTH是“希望有幫助”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking si…

排序算法復習—希爾排序

希爾排序&#xff0c;也稱遞減增量排序算法&#xff0c;是插入排序的一種更高效的改進版本。 希爾排序將整個待排元素序列分割成若干個子序列&#xff08;由相隔某個“增量”的元素組成的&#xff09;分別進行直接插入排序&#xff0c;過程中較小的元素&#xff0c;跳躍式的往前…

《MySQL——幻讀與next-key lock與間隙鎖帶來的死鎖》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);該表除了主鍵id&#xff0c;還有索引c。 問下面的語句…

css 陰影 效果_CSS陰影效果

css 陰影 效果CSS中的陰影效果 (Shadow Effects in CSS) It is always good to make our web pages stylish and beautiful, web pages that would catch users eyes instantly but one gets confused as to how to style his or her web page. The confusion is quite legit t…

java常見的ClassNotFoundException-----菜鳥學習java

java常見的ClassNotFoundException 1 - java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 添加包common-logging.jar2 - java.lang.ClassNotFoundException: javax.transaction.Synchronization 添加包jta.jar(hiberante)3 - java.lang.ClassNo…

關于easyui的一些小知識點(1)

讓layout布局自動適應瀏覽器寬度只需要加上fit"true"屬性。轉載于:https://www.cnblogs.com/haifg/p/3613789.html