MYSQL面試題
MYSQL:(三種創(chuàng)建,四條語句,五種約束)
三種方法:MySQL創(chuàng)建用戶的方法分成三種:INSERT USER表的方法、CREATE USER的方法、GRANT的方法
一、賬號名稱的構(gòu)成方式
賬號的組成方式:用戶名+主機(所以可以出現(xiàn)重復(fù)的用戶名,跟其他的[數(shù)據(jù)庫](http://lib.csdn.net/base/mysql "MySQL知識庫")不一樣)
用戶名:16字符以內(nèi).
主機名:可以用主機名和IP地址,也可以用通配符
通配符說明:172.18.10.%(IP地址為172.18.10段的所有IP地址都可以訪問)
二、通過CREATE USER命令進行創(chuàng)建用戶
腳本:CREATE USER 'username@host' [IDENTIFIED BY 'PASSWORD'] 其中密碼是可選項;
例子:CREATE USER 'john@192.168.189.71' IDENTIFIED BY "123";
CREATE USER 'john@192.168.189.%' IDENTIFIED BY "123";
CREATE USER 'john@' ;
說明:該方法創(chuàng)建出來的用戶只有連接數(shù)據(jù)庫的權(quán)限,需要后續(xù)繼續(xù)授權(quán);
注意:用戶與@后主機地址是一體的,用一個分號連接,否則會報錯,ERROR 1396 (HY000): Operation CREATE USER failed for 'remote'@'%'
三、通過GRANT命令創(chuàng)建用戶
當(dāng)數(shù)據(jù)庫存在用戶的時候GRANT會對用戶進行授權(quán),但當(dāng)數(shù)據(jù)庫不存在該用戶的時候,就會創(chuàng)建相應(yīng)的用戶并進行授權(quán)。(說明上面那步是多余的)
腳本:
GRANT <ALL|priv1,priv2,.....privn> ON
[object] [IDENTIFIED BY 'password']
[WITH GRANT OPTION];
MAX_QUERIES_PER_HOUR count
MAX_UPDATES_PER_HOUR count
MAX_CONNECTIONS_PER_HOUR count
MAX_USER_CONNECTIONS count
說明:priv代表權(quán)限select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14個權(quán)限
例子:mysql>grant select,insert,update,delete,create,drop on test.hr to john@192.168.10.1 identified by '123';
說明:給主機為192.168.10.1的用戶john分配可對數(shù)據(jù)庫test的hr表進行select,insert,update,delete,create,drop等操作的權(quán)限,并設(shè)定口令為123。
mysql>grant all privileges on test.* to joe@192.168.10.1 identified by '123';
說明:給主機為192.168.10.1的用戶john分配可對數(shù)據(jù)庫test所有表進行所有操作的權(quán)限,并設(shè)定口令為123。
mysql>grant all privileges on *.* to john@192.168.10.1 identified by '123';
說明:給主機為192.168.10.1的用戶john分配可對所有數(shù)據(jù)庫的所有表進行所有操作的權(quán)限,并設(shè)定口令為123。
mysql>grant all privileges on *.* to john@localhost identified by '123';
說明:用戶john分配可對所有數(shù)據(jù)庫的所有表進行所有操作的權(quán)限,并設(shè)定口令為123。
四條語句:增刪改查
insert,delete,update,select
詳細(xì)內(nèi)容請看MYSQL基本操作語句
五種約束:
#五種完整性約束:
#NOT NULL :非空約束,指定某列不能為空;
#UNIQUE : 唯一約束,指定某列或者幾列組合不能重復(fù)
#PRIMARY KEY :主鍵,指定該列的值可以唯一地標(biāo)識該列記錄
#FOREIGN KEY :外鍵,指定該行記錄從屬于主表中的一條記錄,主要用于參照完整性
#CHECK :檢查,指定一個布爾表達式,用于指定對應(yīng)的值必須滿足該表達式(mysql不支持check約束)
1、mysql有哪些常見的引擎,他們有什么區(qū)別?
ISAM MyISAM HEAP InnoDB 4種
a. ISAM:最老的引擎, 執(zhí)行讀取操作的速度很快,而且不占用大量的內(nèi)存和存儲資源。不足,它不支持事務(wù)處理,也不能夠容錯。
b. MyISAM:ISAM的mysql擴張, 繼承了ISAM的優(yōu)點,還增加了一些功能,如 索引,字段管理功能,表格鎖定的機制等。并強調(diào)了快速讀取操作,所以web開發(fā)大多數(shù)用此引擎。缺點和ISAM一樣。而且為了優(yōu)化多個并發(fā)的讀寫操作和鎖定的機制,它必須經(jīng)常運行OPTIMIZE TABLE命令,來恢復(fù)被更新機制所浪費的空間。
c. HEAP: 它允許只駐留在內(nèi)存里的臨時表格,駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快,但是,它的表格存儲在內(nèi)存里,所以不及時保存的話,會造成數(shù)據(jù)丟失。
d. InnoDB, 支持事務(wù)處理(transaction process)和外來鍵。但是速度比前者慢,一般用于處理巨大數(shù)據(jù)量時的最大性能設(shè)計。
2、聽說過mysql的鎖嗎?
鎖(行鎖、表鎖、頁鎖、樂觀鎖、悲觀鎖等)
行鎖 | 表鎖 | 頁鎖 | |
---|---|---|---|
MyISAM | V | ||
BDB | V | V | |
InnoDB | V | V |
開銷、加鎖速度、死鎖、粒度、并發(fā)性能
表鎖:
開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定力度大,發(fā)生鎖沖突概率高,并發(fā)度最低
行鎖:
開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度小,發(fā)生鎖沖突的概率低,并發(fā)度高
頁鎖:
開銷和加鎖速度介于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖之間,并發(fā)度一般
悲觀鎖:在讀取數(shù)據(jù)時鎖住那幾行,其他對這幾行的更新需要等到悲觀鎖結(jié)束時才能繼續(xù)
樂觀鎖:讀取數(shù)據(jù)時不鎖,更新時檢查是否數(shù)據(jù)已經(jīng)被更新過,如果是則取消當(dāng)前更新
一般在悲觀鎖的等待時間過長而不能接受時我們才會選擇樂觀鎖
從數(shù)據(jù)庫sql語句角度看,悲觀鎖一般使用select * from table where condition for update,這個是進行一個強制鎖記錄的操作。而樂觀鎖一般是使用update table set xxx=xxx where condition and version=${version},一般通過版本號來限制需要更新的記錄版本。
之前一直以為select ... for update的效率不高,其實這個和update是一樣的,都會對符合where條件的記錄加鎖。mysql的鎖分為三種,行級鎖、區(qū)間鎖、next-key鎖,具體可以參考:http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
所以可以知道,樂觀鎖的性能之所以比悲觀鎖好,原因不是因為sql語句的不同,而是因為加鎖時間的不同。悲觀鎖認(rèn)為記錄被修改的沖突概率較大,所以在對記錄操作前就將記錄鎖定,然后更新記錄,最后提交,所以提交的成功率很高,但是造成的并發(fā)能力較低。而樂觀鎖認(rèn)為修改記錄的沖突概率很小,所以在更新記錄之前不會鎖記錄,而是在最后提交的時候提交鎖,這樣鎖定記錄的時間較短,并發(fā)能力較高,但是沖突概率就提高了。樂觀鎖一般會使用一個版本號概念,目的是記錄當(dāng)前記錄的版本,如果當(dāng)前記錄沒有被修改,那么相應(yīng)的版本就不會改變。在更新記錄的時候通過版本號來限定更新記錄的版本,起到防止并發(fā)更新的問題。
數(shù)據(jù)庫中有記錄,可以通過樂觀鎖或者悲觀鎖進行鎖定記錄。
樂觀鎖:update tablename set version=version+1 where key=${key} and version=${version},判斷update結(jié)果影響的行數(shù)。將樂觀鎖放在一個事務(wù)中,通過行級鎖進行控制。一個事務(wù)占用了行級鎖,另一個事務(wù)無法獲得鎖,會產(chǎn)生兩種情況,一種是等待鎖超時,一種是版本變更,update失敗。
如果沒有記錄,可以通過insert + 唯一索引的機制進行鎖定,比較暴力,通過鎖表
聽說過事物嗎?事物有哪些特性ACLD
一.什么是事務(wù)
事務(wù)是應(yīng)用程序中一系列嚴(yán)密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務(wù)具有原子性,一個事務(wù)中的一系列的操作要么全部成功,要么一個都不做。
事務(wù)的結(jié)束有兩種,當(dāng)事務(wù)中的所以步驟全部成功執(zhí)行時,事務(wù)提交。如果其中一個步驟失敗,將發(fā)生回滾操作,撤消撤消之前到事務(wù)開始時的所以操作。
二.事務(wù)的 ACID
事務(wù)具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續(xù)性( Durability )。這四個特性簡稱為 ACID 特性。
1 、原子性
事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中包含的各操作要么都做,要么都不做
2 、一致性
事 務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。因此當(dāng)數(shù)據(jù)庫只包含成功事務(wù)提交的結(jié)果時,就說數(shù)據(jù)庫處于一致性狀態(tài)。如果數(shù)據(jù)庫系統(tǒng) 運行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫,這時數(shù)據(jù)庫就處于一種不正確的狀態(tài),或者說是 不一致的狀態(tài)。
3 、隔離性
一個事務(wù)的執(zhí)行不能其它事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其它并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
4 、持續(xù)性
也稱永久性,指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其它操作或故障不應(yīng)該對其執(zhí)行結(jié)果有任何影響。
數(shù)據(jù)庫系統(tǒng)必須維護事務(wù)的以下特性 ( 簡稱 ACID) :
原子性 (Atomicity)
一致性 (Consistency)
隔離性 (Isolation)
持久性 (Durability)
原子性 (Atomicity)
事務(wù)中的所有操作要么全部執(zhí)行,要么都不執(zhí)行;
如果事務(wù)沒有原子性的保證,那么在發(fā)生系統(tǒng)
故障的情況下,數(shù)據(jù)庫就有可能處于不一致狀
態(tài)。