MySQL的特殊關(guān)鍵字提示:hint

我們?cè)诓僮鞅砥帧⒆侄位蛩饕龝r(shí)可以添加 comment 來增強(qiáng)代碼可讀性员淫,以便他人快速讀懂代碼合蔽,這是對(duì)使用數(shù)據(jù)庫的人的一種提示;同樣的介返,還有一種提示拴事,叫做hint,是給數(shù)據(jù)庫的提示圣蝎。

何謂 hint

我們知道在執(zhí)行一條SQL語句時(shí)刃宵,MySQL會(huì)生成一個(gè)執(zhí)行計(jì)劃,而hint就是告訴查詢優(yōu)化器需要按照我們告訴它的方式來生成執(zhí)行計(jì)劃捅彻。
Hint可基于表的連接順序组去、方法、訪問路徑步淹、并行度等規(guī)則對(duì)DML(數(shù)據(jù)操縱語言从隆,Data Manipulation Language)語句產(chǎn)生作用,范圍如下:

使用的優(yōu)化器類型缭裆;
基于代價(jià)的優(yōu)化器的優(yōu)化目標(biāo)键闺,是all_rows還是first_rows澈驼;
表的訪問路徑辛燥,是全表掃描,還是索引掃描缝其,還是直接用rowid挎塌;
表之間的連接類型;
表之間的連接順序内边;
語句的并行程度榴都;

常用 hint

  1. 強(qiáng)制索引 FORCE INDEX
    SELECT * FROM tbl FORCE INDEX (FIELD1) …
  2. 忽略索引 IGNORE INDEX
    SELECT * FROM tbl IGNORE INDEX (FIELD1, FIELD2) …
  3. 關(guān)閉查詢緩沖 SQL_NO_CACHE
    SELECT SQL_NO_CACHE field1, field2 FROM tbl;
    需要查詢實(shí)時(shí)數(shù)據(jù)且頻率不高時(shí),可以考慮把緩沖關(guān)閉漠其,即不論此SQL是否曾被執(zhí)行嘴高,MySQL都不會(huì)在緩沖區(qū)中查找竿音。
  4. 強(qiáng)制查詢緩沖 SQL_CACHE
    SELECT SQL_CACHE * FROM tbl;
    功能同上一條相反,但僅在my.ini中的query_cache_type設(shè)為2時(shí)起作用拴驮。
  5. 優(yōu)先操作 HIGH_PRIORITY
    HIGH_PRIORITY可以使用在select和insert操作中春瞬,讓MYSQL知道,這個(gè)操作優(yōu)先進(jìn)行套啤。
    SELECT HIGH_PRIORITY * FROM tbl;
  6. 滯后操作 LOW_PRIORITY
    LOW_PRIORITY可以使用在insert和update操作中宽气,讓mysql知道,這個(gè)操作滯后纲岭。
    update LOW_PRIORITY tbl set field1= where field1= …
  7. 延時(shí)插入 INSERT DELAYED
    INSERT DELAYED INTO tbl set field1= …
    指客戶端提交插入數(shù)據(jù)申請(qǐng)抹竹,MySQL返回OK狀態(tài)卻并未實(shí)際執(zhí)行,而是存儲(chǔ)在內(nèi)存中排隊(duì)止潮,當(dāng)mysql有空余時(shí)再插入窃判。
    一個(gè)重要的好處是,來自多個(gè)客戶端的插入請(qǐng)求被集中在一起喇闸,編寫入一個(gè)塊袄琳,比獨(dú)立執(zhí)行許多插入要快很多。
    壞處是燃乍,不能返回自增ID唆樊,以及系統(tǒng)崩潰時(shí),MySQL還未來得及被插入的數(shù)據(jù)將會(huì)丟失刻蟹。
  8. 強(qiáng)制連接順序 STRAIGHT_JOIN
    SELECT tbl.FIELD1, tbl2.FIELD2 FROM tbl STRAIGHT_JOIN tbl2 WHERE …
    由上面的SQL語句可知逗旁,通過STRAIGHT_JOIN強(qiáng)迫MySQL按tbl、tbl2的順序連接表舆瘪。如果你認(rèn)為按自己的順序比MySQL推薦的順序進(jìn)行連接的效率高的話片效,就可以通過STRAIGHT_JOIN來確定連接順序。

不常用

  1. 強(qiáng)制使用臨時(shí)表 SQL_BUFFER_RESULT
    SELECT SQL_BUFFER_RESULT * FROM tbl WHERE …
    當(dāng)我們查詢的結(jié)果集中的數(shù)據(jù)比較多時(shí)英古,可以通過SQL_BUFFER_RESULT.選項(xiàng)強(qiáng)制將結(jié)果集放到臨時(shí)表中淀衣,這樣就可以很快地釋放MySQL的表鎖(這樣其它的SQL語句就可以對(duì)這些記錄進(jìn)行查詢了),并且可以長(zhǎng)時(shí)間地為客戶端提供大記錄集召调。
  2. 分組使用臨時(shí)表 SQL_BIG_RESULT和SQL_SMALL_RESULT
    SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM tbl GROUP BY FIELD1;
    對(duì)SELECT語句有效膨桥,告訴MySQL優(yōu)化去對(duì)GROUP BY和DISTINCT查詢?nèi)绾问褂门R時(shí)表排序,SQL_SMALL_RESULT表示結(jié)果集很小唠叛,可以直接在內(nèi)存的臨時(shí)表排序只嚣;反之則很大,需要使用磁盤臨時(shí)表排序艺沼。
  3. SQL_CALC_FOUND_ROWS
    它其實(shí)不是優(yōu)化器提示册舞,也不影響優(yōu)化器的執(zhí)行計(jì)劃,但會(huì)讓mysql返回的結(jié)果集中包含本次操作影響的總行數(shù)澳厢,需與 FOUND_ROWS() 聯(lián)用环础。
    SQL_CALC_FOUND_ROWS 通知MySQL將本次處理的行數(shù)記錄下來; FOUND_ROWS() 用于取出被記錄的行數(shù)剩拢,可以應(yīng)用到分頁場(chǎng)景线得。
    一般的分頁寫法為:先查總數(shù),計(jì)算頁數(shù)徐伐,再查詢某一頁的詳情贯钩。
    SELECT COUNT(*) from tbl WHERE …
    SELECT * FROM tbl WHERE … limit m,n
    但借助SQL_CALC_FOUND_ROWS,可以簡(jiǎn)化成如下寫法:
    SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE … limit m,n;
    SELECT FOUND_ROWS();
    第二條SELECT將返回第一條SELECT不帶limit時(shí)的總行數(shù)办素,如此只需執(zhí)行一次較耗時(shí)的復(fù)雜查詢就可同時(shí)得到總行數(shù)角雷。
  4. LOCK IN SHARE MODE、 FOR UPDATE
    同樣的性穿,這倆也不是優(yōu)化提示勺三,是控制SELECT語句的鎖機(jī)制,只對(duì)行級(jí)鎖有效需曾,即InnoDB支持吗坚。

概念和區(qū)別
SELECT ... LOCK IN SHARE MODE添加的是IS鎖(意向共享鎖),即在符合條件的rows上都加了共享鎖呆万,其他session可讀取記錄商源,亦可繼續(xù)添加IS鎖,但無法修改谋减,直到這個(gè)加鎖的session done(否則直接鎖等待超時(shí))牡彻。
SELECT ... FOR UPDATE 添加的是IX鎖(意向排它鎖),即符合條件的rows上都加了排它出爹,其他session無法給這些記錄添加任何S鎖或X鎖庄吼。如果不存在一致性非鎖定讀的話,則其他session是無法讀取和修改這些記錄的以政,但innodb有非鎖定讀(快照讀不需要加鎖)霸褒。
因此,for update的加鎖方式只是比lock in share mode的方式多阻塞了select...lock in share mode的查詢方式盈蛮,并不會(huì)阻塞快照讀废菱。
應(yīng)用場(chǎng)景
LOCK IN SHARE MODE的適用于兩張存在關(guān)系的表的寫場(chǎng)景,以mysql官方例子來說抖誉,一個(gè)表是child表殊轴,一個(gè)是parent表,假設(shè)child表的某一列child_id映射到parent表的c_child_id列袒炉,從業(yè)務(wù)角度講旁理,此時(shí)直接insert一條child_id=100記錄到child表是存在風(fēng)險(xiǎn)的,因?yàn)閕nsert的同時(shí)可能存在parent表執(zhí)行了刪除c_child_id=100的記錄我磁,業(yè)務(wù)數(shù)據(jù)有不一致的風(fēng)險(xiǎn)孽文。正確方法是先執(zhí)行select * from parent where c_child_id=100 lock in share mode驻襟,鎖定parent表的這條記錄,然后執(zhí)行insert into child(child_id) values (100)芋哭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沉衣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子减牺,更是在濱河造成了極大的恐慌豌习,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔疚,死亡現(xiàn)場(chǎng)離奇詭異肥隆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稚失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門栋艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墩虹,你說我怎么就攤上這事嘱巾。” “怎么了诫钓?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵旬昭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我菌湃,道長(zhǎng)问拘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任惧所,我火速辦了婚禮骤坐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘下愈。我一直安慰自己纽绍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布势似。 她就那樣靜靜地躺著拌夏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪履因。 梳的紋絲不亂的頭發(fā)上障簿,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音栅迄,去河邊找鬼站故。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毅舆,可吹牛的內(nèi)容都是我干的西篓。 我是一名探鬼主播愈腾,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岂津!你這毒婦竟也來了顶滩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤寸爆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盐欺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赁豆,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年冗美,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魔种。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粉洼,死狀恐怖节预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情属韧,我是刑警寧澤安拟,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站宵喂,受9級(jí)特大地震影響糠赦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锅棕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一拙泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裸燎,春花似錦顾瞻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脆炎,卻和暖如春梅猿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秒裕。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工袱蚓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人几蜻。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓喇潘,卻偏偏與公主長(zhǎng)得像体斩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颖低,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容