真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql常見問題

事務(wù)級(jí)別

成都創(chuàng)新互聯(lián)公司專注于建寧網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供建寧營銷型網(wǎng)站建設(shè),建寧網(wǎng)站制作、建寧網(wǎng)頁設(shè)計(jì)、建寧網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造建寧網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供建寧網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

 SQL標(biāo)準(zhǔn)定義了4類隔離級(jí)別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低級(jí)別的隔離級(jí)一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。
Read Uncommitted(讀取未提交內(nèi)容)

       在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級(jí)別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。
Read Committed(讀取提交內(nèi)容)

       這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。這種隔離級(jí)別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit,所以同一select可能返回不同結(jié)果。
Repeatable Read(可重讀)

       這是MySQL的默認(rèn)事務(wù)隔離級(jí)別,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行。不過理論上,這會(huì)導(dǎo)致另一個(gè)棘手的問題:幻讀 (Phantom Read)。簡(jiǎn)單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲(chǔ)引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題。

Serializable(可串行化) 
       這是最高的隔離級(jí)別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。

         這四種隔離級(jí)別采取不同的鎖類型來實(shí)現(xiàn),若讀取的是同一個(gè)數(shù)據(jù)的話,就容易發(fā)生問題。例如:

         臟讀(Drity Read):某個(gè)事務(wù)已更新一份數(shù)據(jù),另一個(gè)事務(wù)在此時(shí)讀取了同一份數(shù)據(jù),由于某些原因,前一個(gè)RollBack了操作,則后一個(gè)事務(wù)所讀取的數(shù)據(jù)就會(huì)是不正確的。

         不可重復(fù)讀(Non-repeatable read):在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。

         幻讀(Phantom Read):在一個(gè)事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個(gè)事務(wù)查詢了幾列(Row)數(shù)據(jù),而另一個(gè)事務(wù)卻在此時(shí)插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中,就會(huì)發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。

         在MySQL中,實(shí)現(xiàn)了這四種隔離級(jí)別,分別有可能產(chǎn)生問題如下所示:

mysql 常見問題

索引無效

索引并不是時(shí)時(shí)都會(huì)生效的,比如以下幾種情況,將導(dǎo)致索引失效:

    1.如果條件中有or,即使其中有條件帶索引也不會(huì)使用(這也是為什么盡量少用or的原因)

mysql 常見問題

注意:要想使用or,又想讓索引生效,只能將or條件中的每個(gè)列都加上索引

2.對(duì)于多列索引,不是使用的第一部分,則不會(huì)使用索引

3.like查詢是以%開頭

mysql 常見問題

    4.如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來,否則不使用索引

mysql 常見問題

5.如果mysql估計(jì)使用全表掃描要比使用索引快,則不使用索引

此外,查看索引的使用情況
show status like ‘Handler_read%';
大家可以注意:
handler_read_key:這個(gè)值越高越好,越高表示使用索引查詢到的次數(shù)
handler_read_rnd_next:這個(gè)值越高,說明查詢低效

索引失效的情形總結(jié)如下:

  • 請(qǐng)求表上的數(shù)據(jù)行超出表總記錄數(shù)30%,變成全表掃描

  • 謂詞上的索引列上存在NULL值

  • 謂詞上的索引列條件使用函數(shù)

  • 謂詞上的索引列條件進(jìn)行了相關(guān)運(yùn)算

  • 謂詞上的索引列條件上使用了<>,NOT IN操作符

  • 復(fù)合索引中,第一個(gè)索引列使用范圍查詢--只能用到部份或無法使用索引

  • 復(fù)合索引中,第一個(gè)查詢條件不是最左索引列

  • 模糊查詢條件列最左以通配符%開始

  • 內(nèi)存表(HEAP表)使用HASH索引時(shí),使用范圍檢索或者ORDER BY

  • 表關(guān)聯(lián)字段類型不一樣(包括某些長度不一樣,但像varchar(10)與char(10)則可以,MYSQL經(jīng)過內(nèi)部優(yōu)化處理)

 

索引類型(按用途非嚴(yán)格劃分)

  • 普通索引,這是最基本的索引,無任何限制

  • 唯一索引,與普通索引類似,索引列值必須唯一,允許NULL值

  • 全文索引,基于詞干方式創(chuàng)建索引,多用于BLOB數(shù)據(jù)類型

  • 單列索引,僅基于一列創(chuàng)建的索引

  • 多列索引,基于多列創(chuàng)建的索引,列順序非常重要

  • 空間索引,用作地理數(shù)據(jù)存儲(chǔ)

  • 主鍵索引,是一種特殊的唯一索引,不允許有NULL值,通常在建表時(shí)創(chuàng)建。

索引的優(yōu)缺點(diǎn)

       索引的優(yōu)點(diǎn)

  • 大大減少了服務(wù)器需要掃描的數(shù)據(jù)量

  • 可以幫助服務(wù)器避免排序或減少使用臨時(shí)表排序

  • 索引可以隨機(jī)I/O變?yōu)轫樞騃/O

 

       索引的缺點(diǎn)

  • 需要占用磁盤空間,因此冗余低效的索引將占用大量的磁盤空間

  • 降低DML性能,對(duì)于數(shù)據(jù)的任意增刪改都需要調(diào)整對(duì)應(yīng)的索引,甚至出現(xiàn)索引分裂

  • 索引會(huì)產(chǎn)生相應(yīng)的碎片,產(chǎn)生維護(hù)開銷

復(fù)合索引:

聯(lián)合索引又叫復(fù)合索引。對(duì)于復(fù)合索引:Mysql從左到右的使用索引中的字段,一個(gè)查詢可以只使用索引中的一部份,但只能是最左側(cè)部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3種組合進(jìn)行查找,但不支持 b,c進(jìn)行查找 .當(dāng)最左側(cè)字段是常量引用時(shí),索引就十分有效。

    兩個(gè)或更多個(gè)列上的索引被稱作復(fù)合索引。

    利用索引中的附加列,您可以縮小搜索的范圍,但使用一個(gè)具有兩列的索引 不同于使用兩個(gè)單獨(dú)的索引。復(fù)合索引的結(jié)構(gòu)與電話簿類似,人名由姓和名構(gòu)成,電話簿首先按姓氏對(duì)進(jìn)行排序,然后按名字對(duì)有相同姓氏的人進(jìn)行排序。如果您知 道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不姓,電話簿將沒有用處。

    所以說創(chuàng)建復(fù)合索引時(shí),應(yīng)該仔細(xì)考慮列的順序。對(duì)索引中的所有列執(zhí)行搜索或僅對(duì)前幾列執(zhí)行搜索時(shí),復(fù)合索引非常有用;僅對(duì)后面的任意列執(zhí)行搜索時(shí),復(fù)合索引則沒有用處。

    如:建立 姓名、年齡、性別的復(fù)合索引。

    create table test(

    a int,

    b int,

    c int,

    KEY a(a,b,c)

    );

    優(yōu): select * from test where a=10 and b>50

    差: select * from test where a50

    優(yōu): select * from test order by a

    差: select * from test order by b

    差: select * from test order by c

    優(yōu): select * from test where a=10 order by a

    優(yōu): select * from test where a=10 order by b

    差: select * from test where a=10 order by c

    優(yōu): select * from test where a>10 order by a

    差: select * from test where a>10 order by b

    差: select * from test where a>10 order by c

    優(yōu): select * from test where a=10 and b=10 order by a

    優(yōu): select * from test where a=10 and b=10 order by b

    優(yōu): select * from test where a=10 and b=10 order by c

    優(yōu): select * from test where a=10 and b=10 order by a

    優(yōu): select * from test where a=10 and b>10 order by b

    差: select * from test where a=10 and b>10 order by c

 

    索引原則

    1.索引越少越好

    原因:主要在修改數(shù)據(jù)時(shí),第個(gè)索引都要進(jìn)行更新,降低寫速度。

    2.最窄的字段放在鍵的左邊

    3.避免file sort排序,臨時(shí)表和表掃描。

B 樹,索引

B+/-Tree原理

B-Tree介紹

B-Tree是一種多路搜索樹(并不是二叉的):
       1.定義任意非葉子結(jié)點(diǎn)最多只有M個(gè)兒子;且M>2;
       2.根結(jié)點(diǎn)的兒子數(shù)為[2, M];
       3.除根結(jié)點(diǎn)以外的非葉子結(jié)點(diǎn)的兒子數(shù)為[M/2, M];
       4.每個(gè)結(jié)點(diǎn)存放至少M(fèi)/2-1(取上整)和至多M-1個(gè)關(guān)鍵字;(至少2個(gè)關(guān)鍵字)
       5.非葉子結(jié)點(diǎn)的關(guān)鍵字個(gè)數(shù)=指向兒子的指針個(gè)數(shù)-1;
       6.非葉子結(jié)點(diǎn)的關(guān)鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
       7.非葉子結(jié)點(diǎn)的指針:P[1], P[2], …, P[M];其中P[1]指向關(guān)鍵字小于K[1]的子樹,P[M]指向關(guān)鍵字大于K[M-1]的子樹,其它P[i]指向關(guān)鍵字屬于(K[i-1], K[i])的子樹;
       8.所有葉子結(jié)點(diǎn)位于同一層;
       如:(M=3)

mysql 常見問題
B-樹的特性:
       1.關(guān)鍵字集合分布在整顆樹中;
       2.任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)結(jié)點(diǎn)中;
       3.搜索有可能在非葉子結(jié)點(diǎn)結(jié)束;
       4.其搜索性能等價(jià)于在關(guān)鍵字全集內(nèi)做一次二分查找;
       5.自動(dòng)層次控制;

B-樹的搜索,從根結(jié)點(diǎn)開始,對(duì)結(jié)點(diǎn)內(nèi)的關(guān)鍵字(有序)序列進(jìn)行二分查找,如果命中則結(jié)束,否則進(jìn)入查詢關(guān)鍵字所屬范圍的兒子結(jié)點(diǎn);重復(fù),直到所對(duì)應(yīng)的兒子指針為空,或已經(jīng)是葉子結(jié)點(diǎn);

B+Tree介紹

B+樹是B-樹的變體,也是一種多路搜索樹:

       1.其定義基本與B-樹同,除了:

       2.非葉子結(jié)點(diǎn)的子樹指針與關(guān)鍵字個(gè)數(shù)相同;

       3.非葉子結(jié)點(diǎn)的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區(qū)間);

       5.為所有葉子結(jié)點(diǎn)增加一個(gè)鏈指針;

       6.所有關(guān)鍵字都在葉子結(jié)點(diǎn)出現(xiàn);

       如:(M=3)

mysql 常見問題

B+的搜索與B-樹也基本相同,區(qū)別是B+樹只有達(dá)到葉子結(jié)點(diǎn)才命中(B-樹可以在非葉子結(jié)點(diǎn)命中),其性能也等價(jià)于在關(guān)鍵字全集做一次二分查找;

       B+的特性:

       1.所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點(diǎn)的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的;

       2.不可能在非葉子結(jié)點(diǎn)命中;

       3.非葉子結(jié)點(diǎn)相當(dāng)于是葉子結(jié)點(diǎn)的索引(稀疏索引),葉子結(jié)點(diǎn)相當(dāng)于是存儲(chǔ)(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;

       4.更適合文件索引系統(tǒng);

mysql中的索引

MySQL中普遍使用B+Tree做索引,但在實(shí)現(xiàn)上又根據(jù)聚簇索引和非聚簇索引而不同。

聚簇索引

所謂聚簇索引,就是指主索引文件和數(shù)據(jù)文件為同一份文件,聚簇索引主要用在Innodb存儲(chǔ)引擎中。在該索引實(shí)現(xiàn)方式中B+Tree的葉子節(jié)點(diǎn)上的data就是數(shù)據(jù)本身,key為主鍵,如果是一般索引的話,data便會(huì)指向?qū)?yīng)的主索引,如下圖所示:
mysql 常見問題
在B+Tree的每個(gè)葉子節(jié)點(diǎn)增加一個(gè)指向相鄰葉子節(jié)點(diǎn)的指針,就形成了帶有順序訪問指針的B+Tree。做這個(gè)優(yōu)化的目的是為了提高區(qū)間訪問的性能,例如圖4中如果要查詢key為從18到49的所有數(shù)據(jù)記錄,當(dāng)找到18后,只需順著節(jié)點(diǎn)和指針順序遍歷就可以一次性訪問到所有數(shù)據(jù)節(jié)點(diǎn),極大提到了區(qū)間查詢效率。

非聚簇索

非聚簇索引就是指B+Tree的葉子節(jié)點(diǎn)上的data,并不是數(shù)據(jù)本身,而是數(shù)據(jù)存放的地址。主索引和輔助索引沒啥區(qū)別,只是主索引中的key一定得是唯一的。主要用在MyISAM存儲(chǔ)引擎中,如下圖:

mysql 常見問題

非聚簇索引比聚簇索引多了一次讀取數(shù)據(jù)的IO操作,所以查找性能上會(huì)差。

Myisam索引與InnoDB索引相比較

  • MyisAM支持全文索引(FULLTEXT)、壓縮索引,InnoDB不支持;

  • InnoDB支持事務(wù),MyisAM不支持;

  • MyisAM順序儲(chǔ)存數(shù)據(jù),索引葉子節(jié)點(diǎn)保存對(duì)應(yīng)數(shù)據(jù)行地址,輔助索引很主鍵索引相差無幾;InnoDB主鍵節(jié)點(diǎn)同時(shí)保存數(shù)據(jù)行,其他輔助索引保存的是主鍵索引的值;

  • MyisAM鍵值分離,索引載入內(nèi)存(key_buffer_size),數(shù)據(jù)緩存依賴操作系統(tǒng);InnoDB鍵值一起保存,索引與數(shù)據(jù)一起載入InnoDB緩沖池;MyisAM主鍵(唯一)索引按升序來存儲(chǔ)存儲(chǔ),InnoDB則不一定

  • MyisAM索引的基數(shù)值(Cardinality,show index 命令可以看見)是精確的,InnoDB則是估計(jì)值。這里涉及到信息統(tǒng)計(jì)的知識(shí),MyisAM統(tǒng)計(jì)信息是保存磁盤中,在alter表或Analyze table操作更新此信息,而InnoDB則是在表第一次打開的時(shí)候估計(jì)值保存在緩存區(qū)內(nèi);

  • MyisAM處理字符串索引時(shí)用增量保存的方式,如第一個(gè)索引是‘preform’,第二個(gè)是‘preformence’,則第二個(gè)保存是‘7,ance’,這個(gè)明顯的好處是縮短索引,但是缺陷就是不支持倒序提取索引,必須順序遍歷獲取索引

為什么選用B+/-Tree

一般來說,索引本身也很大,不可能全部存儲(chǔ)在內(nèi)存中,因此索引往往以索引文件的形式存儲(chǔ)的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤I/O消耗,相對(duì)于內(nèi)存存取,I/O存取的消耗要高幾個(gè)數(shù)量級(jí),所以評(píng)價(jià)一個(gè)數(shù)據(jù)結(jié)構(gòu)作為索引的優(yōu)劣最重要的指標(biāo)就是在查找過程中磁盤I/O操作次數(shù)的漸進(jìn)復(fù)雜度。換句話說,索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤I/O的存取次數(shù)。

簡(jiǎn)單點(diǎn)說說內(nèi)存讀取,內(nèi)存是由一系列的存儲(chǔ)單元組成的,每個(gè)存儲(chǔ)單元存儲(chǔ)固定大小的數(shù)據(jù),且有一個(gè)唯一地址。當(dāng)需要讀內(nèi)存時(shí),將地址信號(hào)放到地址總線上傳給內(nèi)存,內(nèi)存解析信號(hào)并定位到存儲(chǔ)單元,然后把該存儲(chǔ)單元上的數(shù)據(jù)放到數(shù)據(jù)總線上,回傳。

寫內(nèi)存時(shí),系統(tǒng)將要寫入的數(shù)據(jù)和單元地址分別放到數(shù)據(jù)總線和地址總線上,內(nèi)存讀取兩個(gè)總線的內(nèi)容,做相應(yīng)的寫操作。

內(nèi)存存取效率,跟次數(shù)有關(guān),先讀取A數(shù)據(jù)還是后讀取A數(shù)據(jù)不會(huì)影響存取效率。而磁盤存取就不一樣了,磁盤I/O涉及機(jī)械操作。磁盤是由大小相同且同軸的圓形盤片組成,磁盤可以轉(zhuǎn)動(dòng)(各個(gè)磁盤須同時(shí)轉(zhuǎn)動(dòng))。磁盤的一側(cè)有磁頭支架,磁頭支架固定了一組磁頭,每個(gè)磁頭負(fù)責(zé)存取一個(gè)磁盤的內(nèi)容。磁頭不動(dòng),磁盤轉(zhuǎn)動(dòng),但磁臂可以前后動(dòng),用于讀取不同磁道上的數(shù)據(jù)。磁道就是以盤片為中心劃分出來的一系列同心環(huán)(如圖標(biāo)紅那圈)。磁道又劃分為一個(gè)個(gè)小段,叫扇區(qū),是磁盤的最小存儲(chǔ)單元。
mysql 常見問題
磁盤讀取時(shí),系統(tǒng)將數(shù)據(jù)邏輯地址傳給磁盤,磁盤的控制電路會(huì)解析出物理地址,即哪個(gè)磁道哪個(gè)扇區(qū)。于是磁頭需要前后移動(dòng)到對(duì)應(yīng)的磁道,消耗的時(shí)間叫尋道時(shí)間,然后磁盤旋轉(zhuǎn)將對(duì)應(yīng)的扇區(qū)轉(zhuǎn)到磁頭下,消耗的時(shí)間叫旋轉(zhuǎn)時(shí)間。所以,適當(dāng)?shù)牟僮黜樞蚝蛿?shù)據(jù)存放可以減少尋道時(shí)間和旋轉(zhuǎn)時(shí)間。
為了盡量減少I/O操作,磁盤讀取每次都會(huì)預(yù)讀,大小通常為頁的整數(shù)倍。即使只需要讀取一個(gè)字節(jié),磁盤也會(huì)讀取一頁的數(shù)據(jù)(通常為4K)放入內(nèi)存,內(nèi)存與磁盤以頁為單位交換數(shù)據(jù)。因?yàn)榫植啃栽碚J(rèn)為,通常一個(gè)數(shù)據(jù)被用到,其附近的數(shù)據(jù)也會(huì)立馬被用到。

B-Tree:如果一次檢索需要訪問4個(gè)節(jié)點(diǎn),數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)者利用磁盤預(yù)讀原理,把節(jié)點(diǎn)的大小設(shè)計(jì)為一個(gè)頁,那讀取一個(gè)節(jié)點(diǎn)只需要一次I/O操作,完成這次檢索操作,最多需要3次I/O(根節(jié)點(diǎn)常駐內(nèi)存)。數(shù)據(jù)記錄越小,每個(gè)節(jié)點(diǎn)存放的數(shù)據(jù)就越多,樹的高度也就越小,I/O操作就少了,檢索效率也就上去了。

B+Tree:非葉子節(jié)點(diǎn)只存key,大大滴減少了非葉子節(jié)點(diǎn)的大小,那么每個(gè)節(jié)點(diǎn)就可以存放更多的記錄,樹更矮了,I/O操作更少了。所以B+Tree擁有更好的性能

InnoDB與Myisam

 

二者之間有六大區(qū)別:

 


MyISAMInnoDB



構(gòu)成上的區(qū)別:
每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件。第一個(gè) 文件的名字以表的名字開始,擴(kuò)展名指出文件類型。
.frm文件存儲(chǔ)表定義。
數(shù)據(jù)文件的擴(kuò) 展名為.MYD (MYData)。
索引文件的擴(kuò) 展名是.MYI (MYIndex)。
基于磁盤的資源是InnoDB表空間數(shù)據(jù)文件和它的日志文件,InnoDB 表的 大小只受限于操作系統(tǒng)文件的大小,一般為 2GB

事務(wù)處理上方面:
MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù) 度比InnoDB類型更快,但是不提供事務(wù)支持InnoDB提供事務(wù)支持事務(wù),外部鍵等高級(jí) 數(shù)據(jù)庫功能

 

 

 

 

 

 

 

 

SELECT 

UPDATE

INSERT

Delete










如果執(zhí)行大量的SELECT,MyISAM是更好的選擇
1.如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表
2.DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的 刪除。
3.LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用










對(duì)AUTO_INCREMENT的 操作

 

 

每表一個(gè)AUTO_INCREMEN列的內(nèi)部處理。
MyISAM為INSERT和UPDATE操 作自動(dòng)更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂?shù)闹当粍h除之后就不 能再利用。(當(dāng)AUTO_INCREMENT列被定義為多列索引的最后一列, 可以出現(xiàn)重使用從序列頂部刪除的值的情況)。
AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置

對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但 是在MyISAM表中,可以和其他字段一起建立聯(lián) 合索引

更好和更快的auto_increment處理

如果你為一個(gè)表指定AUTO_INCREMENT列,在數(shù)據(jù)詞典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長計(jì)數(shù) 器的計(jì)數(shù)器,它被用在為該列賦新值。

 

自動(dòng)增長計(jì)數(shù) 器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤上

關(guān)于該計(jì)算器 的算法實(shí)現(xiàn),請(qǐng)參考

AUTO_INCREMENT列 在InnoDB里 如何工作



表的具體行數(shù)

select count(*) from table,MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù),注意的是,當(dāng)count(*)語句包含 where條件時(shí),兩種表的操作是一樣的InnoDB 中不 保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行












表鎖

提供行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in
SELECTs),另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí) 行一個(gè)SQL語句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,例如update table set num=1 where name like “%aaa%”

 

MySQL存儲(chǔ)引擎MyISAM與InnoDB如何選擇

MySQL有多種存儲(chǔ)引擎,每種存儲(chǔ)引擎有各自的優(yōu)缺點(diǎn),可以擇優(yōu)選擇使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

雖然MySQL里的存儲(chǔ)引擎不只是MyISAM與InnoDB這兩個(gè),但常用的就是它倆了??赡苡姓鹃L并未注意過MySQL的存儲(chǔ)引擎,其實(shí)存儲(chǔ)引擎也是數(shù)據(jù)庫設(shè)計(jì)里的一大重要點(diǎn),那么博客系統(tǒng)應(yīng)該使用哪種存儲(chǔ)引擎呢?

下面我們分別來看兩種存儲(chǔ)引擎的區(qū)別。

一、InnoDB支持事務(wù),MyISAM不支持,這一點(diǎn)是非常之重要。事務(wù)是一種高級(jí)的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而MyISAM就不可以了。

二、MyISAM適合查詢以及插入為主的應(yīng)用,InnoDB適合頻繁修改以及涉及到安全性較高的應(yīng)用

三、InnoDB支持外鍵,MyISAM不支持

四、從MySQL5.5.5以后,InnoDB是默認(rèn)引擎

五、InnoDB不支持FULLTEXT類型的索引

六、InnoDB中不保存表的行數(shù),如select count(*) from table時(shí),InnoDB需要掃描一遍整個(gè)表來計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語句包含where條件時(shí)MyISAM也需要掃描整個(gè)表

七、對(duì)于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引

八、清空整個(gè)表時(shí),InnoDB是一行一行的刪除,效率非常慢。MyISAM則會(huì)重建表

九、InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%'

通過以上九點(diǎn)區(qū)別,結(jié)合個(gè)人博客的特點(diǎn),推薦個(gè)人博客系統(tǒng)使用MyISAM,因?yàn)樵诓┛屠镏饕僮魇亲x取和寫入,很少有鏈?zhǔn)讲僮?。所以選擇MyISAM引擎使你博客打開也頁面的效率要高于InnoDB引擎的博客,當(dāng)然只是個(gè)人的建議,大多數(shù)博客還是根據(jù)實(shí)際情況下謹(jǐn)慎選擇。

關(guān)于MyISAM與InnoDB選擇使用:

MYISAM和INNODB是Mysql數(shù)據(jù)庫提供的兩種存儲(chǔ)引擎。兩者的優(yōu)劣可謂是各有千秋。INNODB會(huì)支持一些關(guān)系數(shù)據(jù)庫的高級(jí)功能,如事務(wù)功能和行級(jí)鎖,MYISAM不支持。MYISAM的性能更優(yōu),占用的存儲(chǔ)空間少。所以,選擇何種存儲(chǔ)引擎,視具體應(yīng)用而定。

 

如果你的應(yīng)用程序一定要使用事務(wù),毫無疑問你要選擇INNODB引擎。但要注意,INNODB的行級(jí)鎖是有條件的。在where條件沒有使用主鍵時(shí),照樣會(huì)鎖全表。比如DELETE FROM mytable這樣的刪除語句。

 

如果你的應(yīng)用程序?qū)Σ樵冃阅芤筝^高,就要使用MYISAM了。MYISAM索引和數(shù)據(jù)是分開的,而且其索引是壓縮的,可以更好地利用內(nèi)存。所以它的查詢性能明顯優(yōu)于INNODB。壓縮后的索引也能節(jié)約一些磁盤空間。MYISAM擁有全文索引的功能,這可以極大地優(yōu)化LIKE查詢的效率。

 

有人說MYISAM只能用于小型應(yīng)用,其實(shí)這只是一種偏見。如果數(shù)據(jù)量比較大,這是需要通過升級(jí)架構(gòu)來解決,比如分表分庫,而不是單純地依賴存儲(chǔ)引擎。

 

其他一些說法:

現(xiàn)在一般都是選用innodb了,主要是myisam的全表鎖,讀寫串行問題,并發(fā)效率鎖表,效率低myisam對(duì)于讀寫密集型應(yīng)用一般是不會(huì)去選用的。

關(guān)于Mysql數(shù)據(jù)庫默認(rèn)的存儲(chǔ)引擎:

MyISAM和InnoDB是MySQL的兩種存儲(chǔ)引擎。如果是默認(rèn)安裝,那就應(yīng)該是InnoDB,你可以在my.ini文件中找到default-storage-engine=INNODB;當(dāng)然你可以在建表時(shí)指定相應(yīng)的存儲(chǔ)引擎。通過show create table xx 可以看見相應(yīng)信息。

Mysql中InnoDB和MyISAM的比較

MyISAM:

        每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。

        MyISAM表格可以被壓縮,而且它們支持全文搜索。不支持事務(wù),而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。在進(jìn)行updata時(shí)進(jìn)行表鎖,并發(fā)量相對(duì)較小。如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。

        MyISAM的索引和數(shù)據(jù)是分開的,并且索引是有壓縮的,內(nèi)存使用率就對(duì)應(yīng)提高了不少。能加載更多索引,而Innodb是索引和數(shù)據(jù)是緊密捆綁的,沒有使用壓縮從而會(huì)造成Innodb比MyISAM體積龐大不小

        MyISAM緩存在內(nèi)存的是索引,不是數(shù)據(jù)。而InnoDB緩存在內(nèi)存的是數(shù)據(jù),相對(duì)來說,服務(wù)器內(nèi)存越大,InnoDB發(fā)揮的優(yōu)勢(shì)越大。

優(yōu)點(diǎn):查詢數(shù)據(jù)相對(duì)較快,適合大量的select,可以全文索引。

缺點(diǎn):不支持事務(wù),不支持外鍵,并發(fā)量較小,不適合大量update

InnoDB:

        這種類型是事務(wù)安全的。.它與BDB類型具有相同的特性,它們還支持外鍵。InnoDB表格速度很快。具有比BDB還豐富的特性,因此如果需要一個(gè)事務(wù)安全的存儲(chǔ)引擎,建議使用它。在update時(shí)表進(jìn)行行鎖,并發(fā)量相對(duì)較大。如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。

優(yōu)點(diǎn):支持事務(wù),支持外鍵,并發(fā)量較大,適合大量update

缺點(diǎn):查詢數(shù)據(jù)相對(duì)較快,不適合大量的select

 

         對(duì)于支持事物的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認(rèn)設(shè)置是打開的,而且程序沒有顯式調(diào)用BEGIN 開始事務(wù),導(dǎo)致每插入一條都自動(dòng)Commit,嚴(yán)重影響了速度??梢栽趫?zhí)行sql前調(diào)用begin,多條sql形成一個(gè)事物(即使autocommit打開也可以),將大大提高性能。

 

基本的差別為:MyISAM類型不支持事務(wù)處理等高級(jí)處理,而InnoDB類型支持。

        MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持,而InnoDB提供事務(wù)支持已經(jīng)外部鍵等高級(jí)數(shù)據(jù)庫功能。

spring 事務(wù):

Spring中Propagation類的事務(wù)屬性詳解:

PROPAGATION_REQUIRED:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。這是最常見的選擇。 

PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。 

PROPAGATION_MANDATORY:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。 

PROPAGATION_REQUIRES_NEW:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。

PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。 

PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。 

PROPAGATION_NESTED:支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)存在,則執(zhí)行一個(gè)嵌套事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)。

事物超時(shí)設(shè)置:
@Transactional(timeout=30) //默認(rèn)是30秒

事務(wù)隔離級(jí)別:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
讀取未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀, 不可重復(fù)讀) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
讀取已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重復(fù)讀(會(huì)出現(xiàn)幻讀)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化

MYSQL: 默認(rèn)為REPEATABLE_READ級(jí)別
SQLSERVER: 默認(rèn)為READ_COMMITTED

臟讀 : 一個(gè)事務(wù)讀取到另一事務(wù)未提交的更新數(shù)據(jù)
不可重復(fù)讀 : 在同一事務(wù)中, 多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同, 換句話說, 
后續(xù)讀取可以讀到另一事務(wù)已提交的更新數(shù)據(jù). 相反, "可重復(fù)讀"在同一事務(wù)中多次
讀取數(shù)據(jù)時(shí), 能夠保證所讀數(shù)據(jù)一樣, 也就是后續(xù)讀取不能讀到另一事務(wù)已提交的更新數(shù)據(jù)
幻讀 : 一個(gè)事務(wù)讀到另一個(gè)事務(wù)已提交的insert數(shù)據(jù)


當(dāng)前標(biāo)題:mysql常見問題
瀏覽地址:http://weahome.cn/article/gcppei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部