mysql索引和優(yōu)化

總結一下自己的一點見解

1.1首先需要了解數據庫查找的過程
磁盤是一個扁平的圓盤(與電唱機的唱片類似)。盤面上有許多稱為磁道的圓圈,數據就記錄在這些磁道上。磁盤可以是單片的,也可以是由若干盤片組成的盤組棘伴,每一盤片上有兩個面。如下圖中所示的6片盤組為例屁置,除去最頂端和最底端的外側面不存儲數據之外焊夸,一共有10個面可以用來保存信息。

當磁盤驅動器執(zhí)行讀/寫功能時蓝角。盤片裝在一個主軸上阱穗,并繞主軸高速旋轉,當磁道在讀/寫頭(又叫磁頭) 下通過時使鹅,就可以進行數據的讀 / 寫了揪阶。
一般磁盤分為固定頭盤(磁頭固定)和活動頭盤。固定頭盤的每一個磁道上都有獨立的磁頭患朱,它是固定不動的鲁僚,專門負責這一磁道上數據的讀/寫。
活動頭盤 (如上圖)的磁頭是可移動的。每一個盤面上只有一個磁頭(磁頭是雙向的冰沙,因此正反盤面都能讀寫)侨艾。它可以從該面的一個磁道移動到另一個磁道。所有磁頭都裝在同一個動臂上拓挥,因此不同盤面上的所有磁頭都是同時移動的(行動整齊劃一)唠梨。當盤片繞主軸旋轉的時候,磁頭與旋轉的盤片形成一個圓柱體侥啤。各個盤面上半徑相同的磁道組成了一個圓柱面当叭,我們稱為柱面 。因此盖灸,柱面的個數也就是盤面上的磁道數蚁鳖。

1.2磁盤的讀/寫原理和效率
磁盤上數據必須用一個三維地址唯一標示:柱面號、盤面號赁炎、塊號(磁道上的盤塊)醉箕。
讀/寫磁盤上某一指定數據需要下面3個步驟:
(1) 首先移動臂根據柱面號使磁頭移動到所需要的柱面上,這一過程被稱為定位或查找 甘邀。
(2) 如上圖11.3中所示的6盤組示意圖中琅攘,所有磁頭都定位到了10個盤面的10條磁道上(磁頭都是雙向的)垮庐。這時根據盤面號來確定指定盤面上的磁道松邪。
(3) 盤面確定以后,盤片開始旋轉哨查,將指定塊號的磁道段移動至磁頭下逗抑。
經過上面三個步驟,指定數據的存儲位置就被找到寒亥。這時就可以開始讀/寫操作了邮府。
訪問某一具體信息,由3部分時間組成:
● 查找時間(seek time) Ts: 完成上述步驟(1)所需要的時間溉奕。這部分時間代價最高褂傀,最大可達到0.1s左右。
● 等待時間(latency time) Tl: 完成上述步驟(3)所需要的時間加勤。由于盤片繞主軸旋轉速度很快仙辟,一般為7200轉/分(電腦硬盤的性能指標之一, 家用的普通硬盤的轉速一般有5400rpm(筆記本)、7200rpm幾種)鳄梅。因此一般旋轉一圈大約0.0083s叠国。
● 傳輸時間(transmission time) Tt: 數據通過系統(tǒng)總線傳送到內存的時間,一般傳輸一個字節(jié)(byte)大概0.02us=210^(-8)s
磁盤讀取數據是以盤塊(block)
為基本單位的戴尸。位于同一盤塊中的所有數據都能被一次性全部讀取出來粟焊。而磁盤IO代價主要花費在查找時間Ts上。因此我們應該盡量將相關信息存放在同一盤塊,同一磁道中项棠”ǎ或者至少放在同一柱面或相鄰柱面上,以求在讀/寫信息時盡量減少磁頭來回移動的次數沾乘,避免過多的查找時間Ts*怜奖。

1.3
sql語句和其他語言沒有多大的區(qū)別,需要經過解析器和編譯器來轉換成二進制代碼翅阵。在sql中還有優(yōu)化性能的緩存等組件歪玲。

block數據由DMA從硬盤copy到內存中

2.1
mysql優(yōu)化可以朝著上面描述等幾個方面去著手。
● 對于查找時間的優(yōu)化掷匠,sql聚集索引使用b-樹來減小查找時間


由上圖可以明白滥崩,查找到對應盤塊記錄的次數為樹的高度,這也是它比二叉樹所在對優(yōu)勢讹语,底的增大使得樹的高度減小钙皮,從而減小查詢次數。在此基礎上顽决,發(fā)展出了B+樹短条,b*樹更加增加了數據的查找的性能。

●對與聚集索引才菠,因為其為在空間中連續(xù)的存儲茸时,所以最好不要進行大量的修改和增刪操作。
b+樹在表單數據量非常龐大時會退化成遍歷查詢赋访,所以在表單數據量變得很大的時候我們需要對表進行分區(qū)操作可都,具體操作請看(http://www.cnblogs.com/AK2012/archive/2012/12/25/2012-1228.html)

●對于sql非聚集索引,采用的是另外一種為r樹的數據結構蚓耽。
下圖是Guttman論文中的一幅圖:


這里簡單解釋一下渠牲,對于空間中不規(guī)則的r8,用最小的矩形來把它包裹住步悠,而r9,r10也是相同的道理签杈。r8,r9,r10的頁節(jié)點為r3,為葉子節(jié)點的最小包裹矩形鼎兽,依次類推答姥。

r樹很好的解決了不連貫的空間存儲如何查找的問題,但是擴展到6維以上會導致r樹性能下降退化為遍歷操作(我不是很明白這點)

非聚集索引使用指針來表達對應的區(qū)塊接奈,使得修改操作變得容易很多踢涌。

3.優(yōu)化
3.1
對于sql語句編譯和解析器來說,
select ** from dual *
SELECT * FROM dual
為不同的語句序宦,這樣在編譯的時候會增加編譯的時間睁壁,所以在寫sql語句的時候盡聊使用規(guī)范化的語句,保證一致性。
**select * from orderheader where changetime >'2010-10-20 00:00:01'
**select * from orderheader where changetime >'2010-09-22 00:00:01'
以上兩句語句潘明,查詢優(yōu)化器認為是不同的SQL語句行剂,需要解析兩次。如果采用綁定變量
select * from orderheader where changetime >@chgtime

3.2
有的時候會需要進行一些模糊查詢比如
select*from contact where username like ‘%yue%’

關鍵詞%yue%钳降,由于yue前面用到了“%”厚宰,索引這時候實效sql引擎便會遍歷全表,除非必要遂填,否則不要在關鍵詞前加%铲觉。盡量使用yue%等確定的前綴

3.3
綁定變量在php和java對數據庫操作的時候很常見,我在查找python對次此采取的操作時并沒有查到對應的方法吓坚。
先給sql引擎發(fā)送一個sql語句撵幽,后面使用綁定變量,引擎中語句緩存會識別語句從而減少解析和編譯的時間礁击。
我看到一篇blog中寫的批量執(zhí)行語句時已經對綁定變量做了優(yōu)化的盐杂。(MySQLdb中的cursor.executemany我懷疑并沒有做對應的優(yōu)化策略)

3.4盡量少使用or語句,在執(zhí)行or語句的時候哆窿,sql引擎會放棄索引查找的方式而使用遍歷查找链烈,極大的增加了查詢的時間。

3.5
使用temp表單來減少對主表對查詢操作,減輕主表熱點程度挚躯。大大減少了程序執(zhí)行中“共享鎖”阻塞“更新鎖”强衡,減少了阻塞,提高了并發(fā)性能秧均。

3.6
SQL Server中一句SQL語句默認就是一個事務食侮,在該語句執(zhí)行完成后也是默認commit的号涯。其實目胡,這就是begin tran的一個最小化的形式,好比在每句語句開頭隱含了一個begin tran链快,結束時隱含了一個commit誉己。

有些情況下,我們需要顯式聲明begin tran域蜗,比如做“插巨双、刪、改”操作需要同時修改幾個表霉祸,要求要么幾個表都修改成功筑累,要么都不成功。begin tran 可以起到這樣的作用丝蹭,它可以把若干SQL語句套在一起執(zhí)行慢宗,最后再一起commit。好處是保證了數據的一致性,但任何事情都不是完美無缺的镜沽。Begin tran付出的代價是在提交之前敏晤,所有SQL語句鎖住的資源都不能釋放,直到commit掉缅茉。

可見嘴脾,如果Begin tran套住的SQL語句太多,那數據庫的性能就糟糕了蔬墩。在該大事務提交之前译打,必然會阻塞別的語句,造成block很多拇颅。

Begin tran使用的原則是扶平,在保證數據一致性的前提下,begin tran 套住的SQL語句越少越好蔬蕊!有些情況下可以采用觸發(fā)器同步數據结澄,不一定要用begin tran。

3.7
SQL Server 表連接的三種方式(參考鏈接地址:http://www.cnblogs.com/ATree/archive/2011/02/13/sql_optimize_1.html
(1) Merge Join
(2) Nested Loop Join
(3) Hash Join
SQL Server 2000只有一種join方式——Nested Loop Join岸夯,如果A結果集較小麻献,那就默認作為外表,A中每條記錄都要去B中掃描一遍猜扮,實際掃過的行數相當于A結果集行數x B結果集行數勉吻。所以如果兩個結果集都很大,那Join的結果很糟糕旅赢。
SQL Server 2005新增了Merge Join齿桃,如果A表和B表的連接字段正好是聚集索引所在字段,那么表的順序已經排好煮盼,只要兩邊拼上去就行了短纵,這種join的開銷相當于A表的結果集行數加上B表的結果集行數,一個是加,一個是乘,可見merge join 的效果要比Nested Loop Join好多了闪水。
如果連接的字段上沒有索引,那SQL2000的效率是相當低的悠就,而SQL2005提供了Hash join,相當于臨時給A充易,B表的結果集加上索引梗脾,因此SQL2005的效率比SQL2000有很大提高,我認為盹靴,這是一個重要的原因炸茧。
總結一下帆疟,在表連接時要注意以下幾點:
(1) 連接字段盡量選擇聚集索引所在的字段
(2) 仔細考慮where條件,盡量減小A宇立、B表的結果集

4
在物理層面上
●增加磁盤的轉速(比較難以實現)
●橫向擴展和縱向擴展(由于硬件設備價格的持續(xù)下降踪宠,很多都會采用這樣的方式)
使用橫向擴展,用負載均衡設備(h5)或者是計算機(使用負載均衡軟件Ngix等)對大量sql語句請求做分流可以大大減輕單個設備的壓力妈嘹。

縱向擴展不太了解柳琢,先暫時放一放(==)
●讀寫分離策略
實際上大量的sql請求為讀請求,在一臺master機器上執(zhí)行update/insert操作润脸,而在多臺slave機器上執(zhí)行讀請求也可以降低設備壓力柬脸。master把更后的表單再 copy給slave。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末毙驯,一起剝皮案震驚了整個濱河市倒堕,隨后出現的幾起案子,更是在濱河造成了極大的恐慌爆价,老刑警劉巖垦巴,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異铭段,居然都是意外死亡骤宣,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門序愚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憔披,“玉大人,你說我怎么就攤上這事爸吮》蚁ィ” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵形娇,是天一觀的道長锰霜。 經常有香客問我,道長埂软,這世上最難降的妖魔是什么锈遥? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任纫事,我火速辦了婚禮勘畔,結果婚禮上,老公的妹妹穿的比我還像新娘丽惶。我一直安慰自己炫七,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布钾唬。 她就那樣靜靜地躺著万哪,像睡著了一般侠驯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奕巍,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天吟策,我揣著相機與錄音,去河邊找鬼的止。 笑死檩坚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的诅福。 我是一名探鬼主播匾委,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氓润!你這毒婦竟也來了赂乐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咖气,失蹤者是張志新(化名)和其女友劉穎挨措,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體崩溪,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡运嗜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了悯舟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担租。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抵怎,靈堂內的尸體忽然破棺而出奋救,到底是詐尸還是另有隱情,我是刑警寧澤反惕,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布尝艘,位于F島的核電站,受9級特大地震影響姿染,放射性物質發(fā)生泄漏背亥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一悬赏、第九天 我趴在偏房一處隱蔽的房頂上張望狡汉。 院中可真熱鬧,春花似錦闽颇、人聲如沸盾戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尖啡。三九已至橄仆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衅斩,已是汗流浹背盆顾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏梆,地道東北人椎扬。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像具温,于是被迫代替她去往敵國和親蚕涤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 本文轉自美團技術團隊感謝提供這么棒的文章 MySQL憑借著出色的性能++铣猩、低廉的成本揖铜、豐富的資源,已經成為絕大多數...
    抓兔子的貓閱讀 599評論 0 10
  • 原文鏈接:MySQL索引背后的數據結構及算法原理 本文以MySQL數據庫為研究對象达皿,討論與數據庫索引相關的一些話題...
    加油小杜閱讀 851評論 0 8
  • 人們也許會長久的凝視它們天吓,甚至在一百年后,帶著渴念追憶它峦椰。 ——致我們年少的小秘...
    綠羽閱讀 738評論 4 12
  • SEO知識: SEO運營:把網站或者自己的產品推廣出去汤功,SEO主要做的事情就是當用戶在百度搜索一個關鍵詞的時候物邑,可...
    sheepmiee閱讀 251評論 0 2
  • 痛苦,是保持清醒的最好方式——范增 你既然已經做出了選擇滔金,又何必去問為什么選擇——衛(wèi)莊 星星為什么看起來如此渺小色解,...
    V逐夢少年閱讀 1,556評論 0 10