數(shù)據(jù)庫

索引

原理

索引就是一個(gè)數(shù)據(jù)結(jié)構(gòu),把表中的記錄用一個(gè)合適高效查找的數(shù)據(jù)結(jié)構(gòu)來表示,目的就是讓查詢變得更高效
在mysql中是用最廣泛的數(shù)據(jù)引擎是InnoDB泪电,里面用的是B+樹索引
B+樹


B+樹
特點(diǎn)

1.非葉子節(jié)點(diǎn)只存儲鍵值和指針挎峦。
2.所有葉子節(jié)點(diǎn)之間都有一個(gè)鏈指針陈哑。
3.數(shù)據(jù)記錄都存放在葉子節(jié)點(diǎn)中诲泌。
在B+樹中因?yàn)槿~子節(jié)點(diǎn)的鍵值是按順序排列的所以進(jìn)行鍵值的范圍查找效率非常高盲赊。
在B+樹中由于一個(gè)節(jié)點(diǎn)存儲了更多的鍵值和指針,所以同樣多的內(nèi)容可以降低樹的高度敷扫,減少磁盤io次數(shù)哀蘑,從而提高效率。

優(yōu)點(diǎn)

索引的優(yōu)點(diǎn)是可以提高檢索數(shù)據(jù)的速度

缺點(diǎn)

建立索引葵第,系統(tǒng)要占用大約為表的1.2倍的硬盤和內(nèi)存空間來保存索引绘迁。
更新數(shù)據(jù)的時(shí)候,系統(tǒng)必須要有額外的時(shí)間來同時(shí)對索引進(jìn)行更新卒密,以維持?jǐn)?shù)據(jù)和索引的一致性——這就如同圖書館要有專門的位置來擺放索引柜缀台,并且每當(dāng)庫存圖書發(fā)生變化時(shí)都需要有人將索引卡片重整以保持索引與庫存的一致。

分類
  • 主鍵索引(PRIMARY KEY)
  • 唯一索引(UNIQUE)
  • 常規(guī)索引(INDEX)
  • 全文索引(FULLTEXT)
主鍵索引
create table sutdent1 (gradeID int(11) auto_increment primary key)

####### 特性
最常見的索引
確保數(shù)據(jù)記錄的唯一性
確保特定數(shù)據(jù)記錄在數(shù)據(jù)庫中的位置
它 是一種特殊的唯一索引哮奇,不允許有空值膛腐。
######## 復(fù)合主鍵
指表的主鍵含有一個(gè)以上的字段組成,不使用無業(yè)務(wù)含義的自增id作為主鍵

create table test
(
   name varchar(19),
   id number,
   value varchar(10),
   primary key (name,id)
)

name和id字段組合起來就是test表的復(fù)合主鍵 ,它的出現(xiàn)是因?yàn)閚ame字段可能會(huì)出現(xiàn)重名,所以要加上id字段鼎俘,這樣就可以保證記錄的唯一性 ,一般情況下哲身,主鍵的字段長度和字段數(shù)目越少越好 。

當(dāng)表中只有一個(gè)主鍵時(shí)贸伐,它是唯一的索引勘天;當(dāng)表中有多個(gè)主鍵時(shí),稱為復(fù)合主鍵捉邢,復(fù)合主鍵聯(lián)合保證唯一索引

######## 聯(lián)合主鍵
多個(gè)主鍵聯(lián)合形成一個(gè)主鍵組合

舉例: 主鍵A跟主鍵B組成聯(lián)合主鍵
主鍵A跟主鍵B的數(shù)據(jù)可以完全相同脯丝,聯(lián)合就在于主鍵A跟主鍵B形成的聯(lián)合主鍵是唯一的。
下例主鍵A數(shù)據(jù)是1伏伐,主鍵B數(shù)據(jù)也是1宠进,聯(lián)合主鍵其實(shí)是11,11是唯一值秘案,不允許再出現(xiàn)11這個(gè)值(即為多對多關(guān)系)
主鍵A數(shù)據(jù) 主鍵B數(shù)據(jù)
1      1
2      2
3      3
主鍵A與主鍵B的聯(lián)合主鍵值最多為: 11砰苍、 12潦匈、 13阱高、 21、 22茬缩、 23赤惊、 31、 32凰锡、 33未舟。

唯一索引
create table student1  (gradeID int(11) auto_increment primary key,gradename varchar(20) not null unique)

####### 特性
避免同一個(gè)表中某數(shù)據(jù)列中的值重復(fù)
一個(gè)表中可以有多個(gè)唯一索引圈暗,只能有一個(gè)主鍵索引
索引列的值必須唯一,但允許有空值

常規(guī)索引

快速定位特定數(shù)據(jù)

create table student1 (id int,index index_tts_id(id))
全文索引

只能用于MyISAM類型的數(shù)據(jù)表
只能用于char裕膀,varchar员串,text數(shù)據(jù)列類型
使用大型數(shù)據(jù)集

單一索引和復(fù)合索引

單一索引 一個(gè)索引只包含單個(gè)列。一個(gè)表可以有多個(gè)單列索引昼扛,但這不是組合索引
復(fù)合索引(組合索引) 一個(gè)索引包含多個(gè)列
create index idx1 on table1(col1)

復(fù)合索引在數(shù)據(jù)庫操作期間所需的開銷更小寸齐,可以代替多個(gè)單一索引。當(dāng)表的行數(shù)遠(yuǎn)遠(yuǎn)大于索引鍵的數(shù)目時(shí)抄谐,使用這種方式可以明顯加快表的查詢速度渺鹦。
create index idx1 on table1(col1,col2,col3)

窄索引和寬索引
窄索引是指索引列為1-2列的索引,如果不特殊說明的話一般是指單一索引。
寬索引也就是索引列超過2列的索引蛹含。

設(shè)計(jì)索引的一個(gè)重要原則就是能用窄索引不用寬索引毅厚,因?yàn)檎饕冉M合索引更有效。
擁有更多的窄索引浦箱,將給優(yōu)化程序提供更多的選擇余地吸耿,這通常有助于提高性能

在where條件中字段用索引,如果用多字段就用復(fù)合索引
select * from table1 where col1= A and col2= B and col3 = C
在select的字段不要建什么索引(如果是要查詢select col1 ,col2, col3 from mytable,就不需要上面的索引了)
根據(jù)where條件建索引是極其重要的一個(gè)原則

雖然索引提高了查詢速度酷窥,同時(shí)也降低了更新表的速度珍语,如對表進(jìn)行INSERT、UPDATE竖幔、DELETE板乙,因?yàn)楦卤頃r(shí),mysql不僅要保存數(shù)據(jù)拳氢,還要保存一下索引文件募逞,建立索引會(huì)占用磁盤空間的索引文件。

最左匹配原則

對于復(fù)合索引馋评,在查詢使用時(shí)放接,最好將條件順序按找索引的順序,這樣效率最高留特。如:
IDX1:create index idx1 on table1(col2,col3,col5)
select * from table1 where col2=A and col3=B and col5=D
如果是"select * from table1 where col3=B and col2=A and col5=D"
或者是"select * from table1 where col3=B"將不會(huì)使用索引纠脾,或者效果不明顯

mysql會(huì)一直向右匹配直到遇到范圍查詢(>、<蜕青、between苟蹈、like)就停止匹配

比如where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)順序的索引右核,d是用不到索引的,因?yàn)閏出現(xiàn)了“>”慧脱。
如果建立(a,b,d,c)的索引則where a = 1 and b = 2 and c > 3 and d = 4 中abcd都可以用到索引,并且a,b,d的順序可以任意調(diào)整
即:select * from test where b=2 and d=4 and a=1and c>3中a,b,c,d也都用到了索引贺喝。

組合索引效率高于多個(gè)列索引菱鸥,因?yàn)樵趫?zhí)行多個(gè)列索引的時(shí)候宗兼,mysql只會(huì)選擇其中一個(gè)效率最好的,但是通過組合索引就直接鎖定那一條信息了

聚集索引和非聚集索引

數(shù)據(jù)庫的索引分為聚集索引和非聚集索引

聚集索引表中的數(shù)據(jù)按主鍵的順序存放氮采,它實(shí)際上就是按主鍵構(gòu)建的一個(gè)B+樹殷绍,葉子節(jié)點(diǎn)存放的是數(shù)據(jù)行記錄。所以數(shù)據(jù)庫中的數(shù)據(jù)實(shí)際上是索引的一部分鹊漠。由于實(shí)際的數(shù)據(jù)頁只能按照一個(gè)順序存放篡帕,所以每張表聚集索引只能有一個(gè)。

非聚集索引的葉子節(jié)點(diǎn)中存放的是鍵值和主鍵值贸呢,所以通過非聚集索引需要先查找到主鍵值然后通過聚集索引查詢到具體的數(shù)據(jù)镰烧,因此非聚集索引的效率要低于聚集索引。
非聚集索引并不會(huì)影響到數(shù)據(jù)的存儲順序楞陷,所以非聚集索引可以存在多個(gè)怔鳖。

連接

左外連接:select … from table(left) left join table(right) on …,以table(left)為基準(zhǔn)固蛾,將table(left)的所有數(shù)據(jù)展出结执,table(right)有對應(yīng)數(shù)據(jù)則顯示,沒有則顯示NULL艾凯。
右外連接:select … from table(left) right join table(right) on …献幔,以table(right)為基準(zhǔn),將table(right)的所有數(shù)據(jù)展出趾诗,table(left)有對應(yīng)數(shù)據(jù)則顯示蜡感,沒有則顯示NULL。
內(nèi)連接:select … from table(left) inner join table(right) on …恃泪,將table(left)和table(right)共有的數(shù)據(jù)(左右都不為NULL)展出郑兴。
全連接:全外連接是左外連接和右外連接的組合。簡單說就是將左外連接和右外連接同時(shí)做多一次贝乎。做在mysql中沒有全連接運(yùn)算情连,但是根據(jù)全連接的定義,我們可以寫成左外連接和右外連接組合起來览效。
union 和union all:union默認(rèn)去除重復(fù)數(shù)據(jù) union distinct union不去除重復(fù)數(shù)據(jù)

image

笛卡爾積:對于A中的每一個(gè)元素却舀,都有對于在B中的所有元素做連接運(yùn)算 〈覆樱可以見得對于兩個(gè)元組分別為m挽拔,n的表。笛卡爾積后得到的元組個(gè)數(shù)為m x n個(gè)元組衡招。而對于mysql來說篱昔,默認(rèn)的連接就是笛卡爾積

導(dǎo)致數(shù)據(jù)庫性能差的原因有哪些

  • 硬件環(huán)境問題,如磁盤IO
  • 查詢語句問題始腾,如join州刽、子查詢、沒建索引
  • 索引失效浪箭,建了索引穗椅,查詢的時(shí)候沒用上
  • 查詢關(guān)聯(lián)了太多的join
  • 服務(wù)器關(guān)聯(lián)緩存,線程數(shù)等
  • 表中存在冗余字段奶栖,在生成笛卡爾積時(shí)耗費(fèi)多余的時(shí)間

ACID事務(wù)的四大特性

數(shù)據(jù)庫事務(wù)是指一個(gè)邏輯單元執(zhí)行的一系列操作匹表,一個(gè)邏輯工作單元必須有四個(gè)屬性,稱為 ACID(原子性宣鄙、一致性袍镀、隔離性和持久性)屬性

  • 原子性(Atomicity):事務(wù)作為一個(gè)整體被執(zhí)行,包含在其中的對數(shù)據(jù)庫的操作要么全部被執(zhí)行冻晤,要么都不執(zhí)行苇羡。
  • 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束鼻弧。
  • 隔離性(Isolation):多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)设江,一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行。
  • 持久性(Durability):已被提交的事務(wù)對數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中

四種隔離

數(shù)據(jù)庫管理系統(tǒng)采用鎖機(jī)制來實(shí)現(xiàn)事務(wù)的隔離性攘轩,當(dāng)多個(gè)事務(wù)同時(shí)更新數(shù)據(jù)庫中的相同數(shù)據(jù)時(shí)叉存,只允許持有鎖的事務(wù)能更新該數(shù)據(jù),其他事務(wù)必須等待度帮,直到前一個(gè)事務(wù)釋放了鎖歼捏,其他事務(wù)才有機(jī)會(huì)更新該數(shù)據(jù)庫。


隔離級別對比表
  • 讀未提交:就是一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù)笨篷。這種隔離級別的一致性是最差的甫菠,可能會(huì)產(chǎn)生“臟讀”、“不可重復(fù)讀”冕屯、“幻讀”寂诱。如無特殊情況,基本是不會(huì)使用這種隔離級別的安聘。讀提交痰洒,能解決臟讀問題
  • 讀提交:就是只能讀到已經(jīng)提交了的內(nèi)容;有事務(wù)對數(shù)據(jù)進(jìn)行更新(UPDATE)操作時(shí)浴韭,讀操作事務(wù)要等待這個(gè)更新操作事務(wù)提交后才能讀取數(shù)據(jù)丘喻,可以解決臟讀問題。但在這個(gè)事例中念颈,出現(xiàn)了一個(gè)事務(wù)范圍內(nèi)兩個(gè)相同的查詢卻返回了不同數(shù)據(jù)泉粉,這就是不可重復(fù)讀,這是各種系統(tǒng)中最常用的一種隔離級別,也是SQL Server和Oracle的默認(rèn)隔離級別嗡靡。這種隔離級別能夠有效的避免臟讀
  • 可重復(fù)讀:專門針對“不可重復(fù)讀”這種情況而制定的隔離級別跺撼,自然,它就可以有效的避免“不可重復(fù)讀”讨彼。而它也是MySql的默認(rèn)隔離級別
  • 序列化 Serializable:這是數(shù)據(jù)庫最高的隔離級別歉井,這種級別下,事務(wù)“串行化順序執(zhí)行”哈误,也就是一個(gè)一個(gè)排隊(duì)執(zhí)行哩至。這種級別下,“臟讀”蜜自、“不可重復(fù)讀”菩貌、“幻讀”都可以被避免,但是執(zhí)行效率奇差重荠,性能開銷也最大箭阶,所以基本沒人會(huì)用
    讀數(shù)據(jù)的概念
    在關(guān)系型數(shù)據(jù)庫中,事務(wù)的隔離性分為四個(gè)隔離級別晚缩,先介紹幾個(gè)關(guān)于讀數(shù)據(jù)的概念
  • 臟讀:所謂臟讀就是對臟數(shù)據(jù)的讀取尾膊,而臟數(shù)據(jù)所指的就是未提交的數(shù)據(jù)。也就是說荞彼,一個(gè)事務(wù)正在對一條記錄做修改冈敛,在這個(gè)事務(wù)完成并提交之前,這條數(shù)據(jù)是出于待定狀態(tài)的(可能提交也可能回滾)鸣皂,這時(shí)抓谴,第二個(gè)事務(wù)來讀取這條沒有提交的數(shù)據(jù),并據(jù)此做進(jìn)一步的處理寞缝,就會(huì)產(chǎn)生未提交的數(shù)據(jù)依賴關(guān)系癌压,這種現(xiàn)象被稱為臟讀。
  • 不可重復(fù)讀:一個(gè)事務(wù)先后讀取同一條記錄荆陆,但兩次讀取的數(shù)據(jù)不同滩届,我們稱之為不可復(fù)讀。也就是說被啼,這個(gè)事務(wù)在兩次讀取之間該數(shù)據(jù)被其他事務(wù)所修改
  • 幻讀:一個(gè)事務(wù)按相同的查詢條件重新讀取以前檢索過得數(shù)據(jù)帜消,卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這個(gè)現(xiàn)象就被稱為幻讀
  • 串行讀:完全的串行話讀浓体,所有SELECT語句都被隱式的轉(zhuǎn)換成SELECT...LOCK IN SHARE MODE泡挺,即讀取使用表級共享鎖,讀寫相互都會(huì)堵塞命浴,隔離級別最高娄猫。

鎖:多個(gè)用戶同時(shí)對數(shù)據(jù)庫并發(fā)操作時(shí)贱除,會(huì)帶來數(shù)據(jù)不一致的問題,鎖主要用于多用戶環(huán)境下保證數(shù)據(jù)庫完整性和一致性
出現(xiàn)目的:處理并發(fā)問題

分類:

從數(shù)據(jù)庫系統(tǒng)角度分:排它鎖媳溺、共享鎖月幌、更新鎖
從程序員角度分:樂觀鎖、悲觀鎖

悲觀鎖

定義:每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改褂删,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖飞醉,這樣別人拿這個(gè)數(shù)據(jù)就會(huì)被block冲茸,直到他解鎖
實(shí)現(xiàn):依靠數(shù)據(jù)庫提供的鎖機(jī)制
缺點(diǎn):數(shù)據(jù)庫性能開銷大屯阀,特別對于長事務(wù)而言
應(yīng)用:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中用了很多這種鎖機(jī)制,比如行鎖轴术、表鎖难衰、讀鎖、寫鎖等逗栽,都是在操作前先上鎖

分類(按使用性質(zhì)):

共享鎖(Share Lock)

S鎖盖袭,也叫讀鎖,用于所有的只讀數(shù)據(jù)操作彼宠。非獨(dú)占的鳄虱,允許多個(gè)并發(fā)事務(wù)讀取其鎖定的資源
性質(zhì):

  • 多個(gè)事務(wù)可封鎖同一個(gè)共享頁
  • 任何事務(wù)都不能修改該頁
  • 通常是該頁被讀取完畢,S鎖立即被釋放
    例子:select * from table 首先鎖定第一頁凭峡,讀取之后拙已,釋放對第一頁的鎖定,然后鎖定第二頁摧冀,允許在讀操作過程中倍踪,修改未被鎖定的第一頁
排它鎖(Exclusive Lock)

X鎖,也叫寫鎖索昂。對數(shù)據(jù)進(jìn)行寫操作建车,若一個(gè)事務(wù)對對象加了排它鎖,其他事務(wù)就不能再給他加任何鎖了
性質(zhì):

  • 僅運(yùn)行一個(gè)事務(wù)封鎖此頁
  • 其他任何事務(wù)必須等到X鎖被釋放才能對該頁進(jìn)行訪問
  • X鎖一直到事務(wù)結(jié)束才能被釋放
    例子:select * from table for update椒惨;
更新鎖

U鎖缤至,在修改操作的初始化階段用來鎖定可能要被修改的資源,避免使用共享鎖造成的死鎖現(xiàn)象
性質(zhì):

  • 用來預(yù)定要對此頁施加X鎖康谆,允許其他事務(wù)讀领斥,但不允許再施加U鎖或X鎖
  • 當(dāng)被讀取的頁要被更新時(shí),則升級為X鎖
    8 U鎖一直到事務(wù)結(jié)束時(shí)才能被釋放

分類(作用范圍分):

行鎖

作用范圍是行級別

表鎖

作用范圍是整張表
在能夠確定哪些行需要鎖的情況下使用行鎖秉宿,不知道影響哪些行時(shí)用表鎖

樂觀鎖

每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改數(shù)據(jù)戒突,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有更新這個(gè)數(shù)據(jù)描睦,可以使用版本號等機(jī)制
適用場景:多讀的場景膊存,可以提高吞吐量
實(shí)現(xiàn):
1、版本號
為數(shù)據(jù)增加一個(gè)版本標(biāo)識,基于數(shù)據(jù)庫表的版本解決方案:為數(shù)據(jù)庫表增加一個(gè)“version”字段來實(shí)現(xiàn)隔崎。讀取出數(shù)據(jù)時(shí)今艺,將此版本號一同讀出,之后更新時(shí)爵卒,對此版本號+1虚缎,此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表中對應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對钓株,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號实牡,則予以更新,否則認(rèn)為是過期數(shù)據(jù)
2轴合、時(shí)間戳
和版本號基本一樣创坞,只是通過時(shí)間戳來判斷,使用數(shù)據(jù)庫服務(wù)器的時(shí)間戳
3受葛、待更新字段(舊系統(tǒng)不能修改數(shù)據(jù)庫表結(jié)構(gòu))
和版本號相似题涨,不增加額外字段,直接使用有效數(shù)據(jù)字段做版本控制信息总滩,假設(shè)有個(gè)待更新字段叫count纲堵,先去讀取這個(gè)count,更新的時(shí)候去比較數(shù)據(jù)庫中的count值是不是開始讀的值闰渔,如果是就更新count值席函,否則更新失敗
4、所有字段
和更新字段類似澜建,只是所有使用字段做版本控制信息向挖,只有所有字段都沒變化才會(huì)執(zhí)行更新
區(qū)別:
新系統(tǒng)設(shè)計(jì)可以使用version方式和timestamp方式,需要增加字段炕舵,應(yīng)用范圍是整條數(shù)據(jù)何之,不論修改哪個(gè)字段都會(huì)更新version,因此兩個(gè)事務(wù)更新同一條記錄的兩個(gè)不相關(guān)字段也是互斥的咽筋,不能同步進(jìn)行溶推。
舊系統(tǒng)不能修改數(shù)據(jù)庫表結(jié)構(gòu)的時(shí)候使用數(shù)據(jù)字段作為版本控制信息,不需要新增字段奸攻,帶更新字段只要其他事物修改的字段和當(dāng)前事物修改的字段沒有重疊就可以同步進(jìn)行蒜危,并發(fā)性更高。

并發(fā)控件造成兩種鎖

相互等待而導(dǎo)致

活鎖

定義:T1封鎖數(shù)據(jù)R睹耐,T2同時(shí)也請求封鎖數(shù)據(jù)R,T3也請求封鎖數(shù)據(jù)R辐赞,當(dāng)T1釋放鎖之后,T3會(huì)鎖住R硝训,T4也請求封鎖R响委,T2就會(huì)一直等待下去
解決方法:先到先服務(wù)策略

死鎖

定義:你等我新思,我等你,雙方就會(huì)一直等待下去赘风,T1封鎖數(shù)據(jù)R1夹囚,請求對R2封鎖,T2封鎖了R2邀窃,請求封鎖R1荸哟,就會(huì)導(dǎo)致死鎖
解決方法:沒有完全解決方法,只能盡量預(yù)防
預(yù)防方法:
1瞬捕、一次性封鎖:一次性將所需數(shù)據(jù)全部鎖住鞍历,擴(kuò)大封鎖范圍,降低系統(tǒng)的并發(fā)度
2山析、順序封鎖:先對數(shù)據(jù)對象指定一個(gè)封鎖順序堰燎,要對數(shù)據(jù)進(jìn)行封鎖掏父,只能按照規(guī)定順序來封鎖
判定是否死鎖:
超時(shí)法:某個(gè)事物的等待時(shí)間超過指定時(shí)限笋轨,則判定為出現(xiàn)死鎖
等待圖法:事物等待圖中出現(xiàn)了回路,判斷出現(xiàn)了死鎖
死鎖解決方法:撤銷一個(gè)處理死鎖代價(jià)最小的事物赊淑,釋放此事物持有的所有鎖爵政,同時(shí)對撤銷的事務(wù)所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復(fù)

InnoDB和MyISAM

InnoDB和MyISAM都是MySQL的存儲引擎

區(qū)別

InnoDB支持事務(wù) MyISAM不支持事務(wù)
InnoDB支持外鍵 MyISAM不支持外鍵
InnoDB是聚集索引 MyISAM是非聚集索引

聚集索引的文件存放在主鍵索引的葉子節(jié)點(diǎn)上,因此InnoDB必須要用主鍵陶缺,通過主鍵索引效率很高钾挟,但是輔助索引需要兩次查詢,先查詢到主鍵饱岸,再通過主鍵查詢到數(shù)據(jù)掺出,因此主鍵不應(yīng)該過大,因?yàn)橹麈I過大苫费,其他索引也都會(huì)很大汤锨。不支持全文索引
MySIAM是非聚集索引,數(shù)據(jù)文件是分離的百框,索引保存的是數(shù)據(jù)文件的指針闲礼,主鍵索引和輔助索引是獨(dú)立的。查詢效率更高铐维,支持全文索引

InnoDB不保存表的具體行數(shù)柬泽,執(zhí)行select count(*) from table時(shí)需要全表掃描。
MySIAM用一個(gè)變量保存了整個(gè)表的行數(shù)嫁蛇,執(zhí)行上述語句時(shí)只需要讀出該變量即可锨并,速度快。

InnoDB最小的鎖粒度是行鎖睬棚,MySIAM最小的鎖粒度是表鎖第煮,一個(gè)更新語句會(huì)鎖住整張表有决,導(dǎo)致其他查詢和更新都會(huì)被阻塞,因此并發(fā)訪問受限空盼。

如何選擇
是否需要支持事務(wù)书幕,若要選擇InnoDB,不要可考慮MyISAM
表中絕大部分是讀查詢揽趾,可以考慮MyISAM台汇,讀寫頻繁,使用InnoDB
系統(tǒng)崩潰后篱瞎,MyISAM恢復(fù)起來更困難

實(shí)際使用

兩個(gè)表查找出語文成績最高的人的姓名

select name from student where score =(select max(score) from student where class='語文')

根據(jù)city分類苟呐,人數(shù)大于2的城市


image

一個(gè)登錄信息表,查詢指定時(shí)間段登錄次數(shù)超過3次的用戶


select username from table where time between '2017-1-1 00:00:00' and '2018-1-1 00:00:00'
group by username
having count(username)>3

求3班同學(xué)的平均分


student:id,name,class_id
score:id,student_id,score

select avg(score.score) from score,student where score.student_id=student.id
and class_id=3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俐筋,一起剝皮案震驚了整個(gè)濱河市牵素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澄者,老刑警劉巖笆呆,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粱挡,居然都是意外死亡赠幕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門询筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榕堰,“玉大人,你說我怎么就攤上這事嫌套∧媛牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵踱讨,是天一觀的道長魏蔗。 經(jīng)常有香客問我,道長勇蝙,這世上最難降的妖魔是什么沫勿? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮味混,結(jié)果婚禮上产雹,老公的妹妹穿的比我還像新娘。我一直安慰自己翁锡,他們只是感情好蔓挖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆衔,像睡著了一般瘟判。 火紅的嫁衣襯著肌膚如雪怨绣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天拷获,我揣著相機(jī)與錄音篮撑,去河邊找鬼。 笑死匆瓜,一個(gè)胖子當(dāng)著我的面吹牛赢笨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驮吱,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼茧妒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了左冬?” 一聲冷哼從身側(cè)響起桐筏,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拇砰,沒想到半個(gè)月后梅忌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毕匀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年铸鹰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皂岔。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖展姐,靈堂內(nèi)的尸體忽然破棺而出躁垛,到底是詐尸還是另有隱情,我是刑警寧澤圾笨,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布教馆,位于F島的核電站,受9級特大地震影響擂达,放射性物質(zhì)發(fā)生泄漏土铺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一板鬓、第九天 我趴在偏房一處隱蔽的房頂上張望悲敷。 院中可真熱鬧,春花似錦俭令、人聲如沸后德。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓢湃。三九已至理张,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绵患,已是汗流浹背雾叭。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留落蝙,地道東北人拷况。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像掘殴,于是被迫代替她去往敵國和親赚瘦。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 1. 數(shù)據(jù)庫范式 第一范式:列不可分奏寨,eg:【聯(lián)系人】(姓名起意,性別,電話)病瞳,一個(gè)聯(lián)系人有家庭電話和公司電話揽咕,那么這...
    無痕25閱讀 645評論 0 0
  • 數(shù)據(jù)庫的基本是概念名詞解釋: 數(shù)據(jù)庫名詞解釋 元組:可以理解為表的每一行就是一個(gè)元組 候選碼:若關(guān)系中的某一屬性組...
    杰倫哎呦哎呦閱讀 1,114評論 0 6
  • 抱佛腳一時(shí)爽,一直抱佛腳一直爽套菜!這篇文章總結(jié)常見的數(shù)據(jù)庫面試問題~因?yàn)槭潜Х鹉_亲善,所以結(jié)構(gòu)上沒有什么邏輯...參考鏈...
    山幺幺閱讀 447評論 0 0
  • 日前全國在“新冠狀病毒”疫情的籠罩下處以一個(gè)非常時(shí)期,為了大家的安全和疫情的控制逗柴,大部分企業(yè)均已延遲上班時(shí)間蛹头。...
    菜菜愛吃菜呀閱讀 816評論 0 0
  • 夜鶯2517閱讀 127,720評論 1 9