MySQL索引及查詢優(yōu)化

1. ? ? 索引及查詢優(yōu)化

索引的類型

??普通索引:這是最基本的索引類型,沒唯一性之類的限制。

??唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。

??主鍵:主鍵是一種唯一索引,但必須指定為”PRIMARY KEY”。

??全文索引:MYSQL從3.23.23開始支持全文索引和全文檢索。在MYSQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創(chuàng)建。

大多數(shù)MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)使用B樹中存儲。空間列類型的索引使用R-樹,MEMORY表支持hash索引。

單列索引和多列索引(復(fù)合索引)

索引可以是單列索引,也可以是多列索引。對相關(guān)的列使用索引是提高SELECT操作性能的最佳途徑之一。

多列索引:

MySQL可以為多個列創(chuàng)建索引。一個索引可以包括15個列。對于某些列類型,可以索引列的左前綴,列的順序非常重要。

多列索引可以視為包含通過連接索引列的值而創(chuàng)建的值的排序的數(shù)組。一般來說,即使是限制最嚴(yán)格的單列索引,它的限制能力也遠(yuǎn)遠(yuǎn)低于多列索引。

最左前綴

多列索引有一個特點(diǎn),即最左前綴(Leftmost Prefixing)。假如有一個多列索引為key(firstname lastname age),當(dāng)搜索條件是以下各種列的組合和順序時,MySQL將使用該多列索引:

firstname,lastname,age

firstname,lastname

firstname

也就是說,相當(dāng)于還建立了key(firstname lastname)和key(firstname)。

索引主要用于下面的操作:

??快速找出匹配一個WHERE子句的行。

??刪除行。當(dāng)執(zhí)行聯(lián)接時,從其它表檢索行。

??對具體有索引的列key_col找出MAX()或MIN()值。由預(yù)處理器進(jìn)行優(yōu)化,檢查是否對索引中在key_col之前發(fā)生所有關(guān)鍵字元素使用了WHERE?key_part_#?=?constant。在這種情況下,MySQL為每個MIN()或MAX()表達(dá)式執(zhí)行一次關(guān)鍵字查找,并用常數(shù)替換它。如果所有表達(dá)式替換為常量,查詢立即返回。例如:

SELECT MIN(key2), MAX (key2)??FROM?tb?WHERE?key1=10;

??如果對一個可用關(guān)鍵字的最左面的前綴進(jìn)行了排序或分組(例如,ORDER BY key_part_1,key_part_2),排序或分組一個表。如果所有關(guān)鍵字元素后面有DESC,關(guān)鍵字以倒序被讀取。

??在一些情況中,可以對一個查詢進(jìn)行優(yōu)化以便不用查詢數(shù)據(jù)行即可以檢索值。如果查詢只使用來自某個表的數(shù)字型并且構(gòu)成某些關(guān)鍵字的最左面前綴的列,為了更快,可以從索引樹檢索出值。

SELECT?key_part3?FROM?tb?WHERE?key_part1=1

有時MySQL不使用索引,即使有可用的索引。一種情形是當(dāng)優(yōu)化器估計(jì)到使用索引將需要MySQL訪問表中的大部分行時。(在這種情況下,表掃描可能會更快些)。然而,如果此類查詢使用LIMIT只搜索部分行,MySQL則使用索引,因?yàn)樗梢愿斓卣业綆仔胁⒃诮Y(jié)果中返回。

合理的建立索引的建議:

(1)? 越小的數(shù)據(jù)類型通常更好:越小的數(shù)據(jù)類型通常在磁盤、內(nèi)存和CPU緩存中都需要更少的空間,處理起來更快。

(2)? 簡單的數(shù)據(jù)類型更好:整型數(shù)據(jù)比起字符,處理開銷更小,因?yàn)樽址谋容^更復(fù)雜。在MySQL中,應(yīng)該用內(nèi)置的日期和時間數(shù)據(jù)類型,而不是用字符串來存儲時間;以及用整型數(shù)據(jù)類型存儲IP地址。

(3)? 盡量避免NULL:應(yīng)該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進(jìn)行查詢優(yōu)化,因?yàn)樗鼈兪沟盟饕⑺饕慕y(tǒng)計(jì)信息以及比較運(yùn)算更加復(fù)雜。你應(yīng)該用0、一個特殊的值或者一個空串代替空值

這部分是關(guān)于索引和寫SQL語句時應(yīng)當(dāng)注意的一些瑣碎建議和注意點(diǎn)。

1.當(dāng)結(jié)果集只有一行數(shù)據(jù)時使用LIMIT 1

2.避免SELECT *,始終指定你需要的列

從表中讀取越多的數(shù)據(jù),查詢會變得更慢。他增加了磁盤需要操作的時間,還是在數(shù)據(jù)庫服務(wù)器與WEB服務(wù)器是獨(dú)立分開的情況下。你將會經(jīng)歷非常漫長的網(wǎng)絡(luò)延遲,僅僅是因?yàn)閿?shù)據(jù)不必要的在服務(wù)器之間傳輸。

3.使用連接(JOIN)來代替子查詢(Sub-Queries)

連接(JOIN).. 之所以更有效率一些,是因?yàn)镸ySQL不需要在內(nèi)存中創(chuàng)建臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

4.使用ENUMCHAR而不是VARCHAR,使用合理的字段屬性長度

5.盡可能的使用NOT NULL

6.固定長度的表會更快

7.拆分大的DELETEINSERT語句

8.查詢的列越小越快

Where條件

在查詢中,WHERE條件也是一個比較重要的因素,盡量少并且是合理的where條件是很重要的,盡量在多個條件的時候,把會提取盡量少數(shù)據(jù)量的條件放在前面,減少后一個where條件的查詢時間。

有些where條件會導(dǎo)致索引無效:

??where子句的查詢條件里有!=,MySQL將無法使用索引。

??where子句使用了Mysql函數(shù)的時候,索引將無效,比如:select * from tb where left(name, 4) = ‘xxx’

??使用LIKE進(jìn)行搜索匹配的時候,這樣索引是有效的:select * from tbl1 where name like ‘xxx%’,而like ‘%xxx%’ 時索引無效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評論 2 375

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