(mysql-5.5.5開始,InnoDB做爲默認存儲引擎)以前是MyISAM,更早是ISAM你能用的數據庫引擎取決於mysql在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須從新編譯MYSQL。在缺省狀況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEYDB(BDB), 也經常可使用。php
ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到數據庫被查詢的次數要遠大於更新的次數。所以,ISAM執行讀取操做的速度很快,並且不佔用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不支持事務處理,也不可以容錯:若是你的硬盤崩潰了,那麼數據文件就沒法恢復了。若是你正在把ISAM用在關鍵任務應用程序裏,那就必須常常備份你全部的實時數據,經過其複製特性,MYSQL可以支持這樣的備份應用程序。java
MYISAM是MYSQL的ISAM擴展格式和缺省的數據庫引擎(5.5以前)。除了提供ISAM裏所沒有的索引和字段管理的大 量功能,MYISAM還使用一種表格鎖定的機制,來優化多個併發的讀寫操做。其代價是你須要常常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MYISAM還有一些有用的擴展,例如用來修復數據庫文件的 MYISAMCHK工具和用來恢復浪費空間的MYISAMPACK工具。mysql
MYISAM強調了快速讀取操做,這可能就是爲何MYSQL受到了WEB開發如此青睞的主要緣由:在WEB開發中你所進行的大量數據操做都是讀取操做。因此,大多數虛擬主機提供商和INTERNET平臺提供商只容許使用MYISAM格式。c++
HEAP容許只駐留在內存裏的臨時表格。駐留在內存使得HEAP比ISAM和MYISAM的速度都快,可是它所管理的數據是不穩定的,並且若是在關機以前沒有進行保存,那麼全部的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間,HEAP表格在你須要使用SELECT表達式來選擇和操控數據的時候很是有用。要記住,用完表格後要刪除表格。web
INNODB和BERKLEYDB(BDB)數據庫引擎都是造就MYSQL靈活性的技術的直接產品,這項技術就是MySql++ API。在使用MySql的時候,你所面對的每個挑戰幾乎都源於ISAM和MYIASM數據庫引擎不支持事務處理也不支持外來鍵。儘管要比ISAM和MYISAM引擎慢不少,可是INNODB和BDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,若是你的設計須要這些特性中的一者或者二者,那你就要被迫使用後兩個引擎中的一個了。sql
根據鎖的類型分,能夠分爲共享鎖,排他鎖,意向共享鎖和意向排他鎖。數據庫
根據鎖的粒度分,又能夠分爲行鎖,表鎖。編程
對於mysql而言,事務機制更可能是靠底層的存儲引擎來實現,所以,mysql層面只有表鎖,而支持事務的innodb存 儲引擎則實現了行鎖(記錄鎖(在行相應的索引記錄上的鎖)),gap鎖(是在索引記錄間歇上的鎖),next-key鎖(是記錄鎖和在此索引記錄以前的gap上的鎖的結合)。Mysql的記錄鎖實質是索引記錄的鎖,由於innodb是索引組織表;gap鎖是索引記錄間隙的鎖,這種鎖只在RR隔離級別下有效;next-key鎖是記錄鎖加上記錄以前gap鎖的組合。mysql經過gap鎖和next-key鎖實現RR隔離級別。安全
說明:對於更新操做(讀不上鎖),只有走索引纔可能上行鎖;不然會對聚簇索引的每一行上寫鎖,實際等同於對錶上寫鎖。服務器
若多個物理記錄對應同一個索引,若同時訪問,也會出現鎖衝突;
當表有多個索引時,不一樣事務能夠用不一樣的索引鎖住不一樣的行,另外innodb會同時用行鎖對數據記錄(聚簇索引)加 鎖。
MVCC(多版本併發控制)併發控制機制下,任何操做都不會阻塞讀操做,讀操做也不會阻塞任何操做,只由於讀不上鎖。
共享鎖:由讀表操做加上的鎖,加鎖後其餘用戶只能獲取該表或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫
排它鎖:由寫表操做加上的鎖,加鎖後其餘用戶不能獲取該表或行的任何鎖,典型是mysql事務中的更新操做
意向共享鎖(IS):事務打算給數據行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
意向排他鎖(IX):事務打算給數據行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。
1.若是MYSQL客戶端和服務器端的鏈接須要跨越並經過不可信任的網絡,那麼須要使用ssh隧道來加密該鏈接的通訊。
2.使用set password語句來修改用戶的密碼,先「mysql -u root」登錄數據庫系統,而後mysql> update mysql.user set password=password(‘newpwd’),最後執行flush privileges就能夠了。
3.Mysql須要提防的***有,防偷聽、篡改、回放、拒絕服務等,不涉及可用性和容錯方面。對全部的鏈接、查詢、其餘操做使用基於acl即訪問控制列表的安全措施來完成。也有一些對ssl鏈接的支持。
4.設置除了root用戶外的其餘任何用戶不容許訪問mysql主數據庫中的user表; 加密後存放在user表中的加密 後的用戶密碼一旦泄露,其餘人能夠隨意用該用戶名/密碼相應的數據庫;
5.使用grant和revoke語句來進行用戶訪問控制的工做;
6.不要使用明文密碼,而是使用md5()和sha1()等單向的哈系函數來設置密碼;
7.不要選用字典中的字來作密碼;
8.採用防火牆能夠去掉50%的外部危險,讓數據庫系統躲在防火牆後面工做,或放置在dmz區域中;
9.從因特網上用nmap來掃描3306端口,也可用telnet server_host 3306的方法測試,不容許從非信任網絡中訪問數據庫服務器的3306號tcp端口,須要在防火牆或路由器上作設定;
10.爲了防止被惡意傳入非法參數,例如where id=234,別人卻輸入where id=234 or 1=1致使所有顯示,因此在web的表單中使用」或」」來用字符串,在動態url中加入%22表明雙引號、%23表明井號、%27表明單引號;傳遞未檢查過的值給mysql數據庫是很是危險的;
11.在傳遞數據給mysql時檢查一下大小;
12.應用程序須要鏈接到數據庫應該使用通常的用戶賬號,開放少數必要的權限給該用戶;
13.在各編程接口(c c++ php perl java jdbc等)中使用特定‘逃脫字符’函數; 在因特網上使用mysql數據 庫時必定少用傳輸明文的數據,而用ssl和ssh的加密方式數據來傳輸;
14.學會使用tcpdump和strings工具來查看傳輸數據的安全性,例如tcpdump -l -i eth0 -w -src or
dst port 3306 strings。以普通用戶來啓動mysql數據庫服務;
15.不使用到表的聯結符號,選用的參數 –skip-symbolic-links;
16.確信在mysql目錄中只有啓動數據庫服務的用戶才能夠對文件有讀和寫的權限;
17.不準將process或super權限付給非管理用戶,該mysqladmin processlist能夠列舉出當前執行的查詢 文本;super權限可用於切斷客戶端鏈接、改變服務器運行參數狀態、控制拷貝複製數據庫的服務器;
18.file權限不付給管理員之外的用戶,防止出現load data ‘/etc/passwd’到表中再用select 顯示出來
的問題;
19.若是不相信dns服務公司的服務,能夠在主機名稱容許表中只設置ip數字地址;
20.使用max_user_connections變量來使mysqld服務進程,對一個指定賬戶限定鏈接數;
21.grant語句也支持資源控制選項;
22.–local-infile=0或1 如果0則客戶端程序就沒法使用local load data了,賦權的一個例子grant insert(user) on mysql.user to ‘user_name’@’host_name’;若使用–skip-grant-tables系統將對任何用戶的訪問不作任何訪問控制,但能夠用 mysqladmin flush-privileges或mysqladmin reload來開啓訪問控制;默認狀況是show databases語句對全部用戶開放,能夠用–skip-show-databases來關閉掉。
23.碰到error 1045(28000) access denied for user ‘root’@’localhost’ (using password:no)錯誤時,你須要從新設置密碼,具體方法是:先用–skip-grant-tables參數啓動mysqld,而後執行 mysql -u root mysql,mysql>update user set password=password(’newpassword’) where user=’root’;mysql>flush privileges;,最後從新啓動mysql就能夠了。
文章推介:
1.sql必會基礎1
點擊技術羣加小編微信入羣。
Java架構師歷程mush專一於爲java工程師提供技術乾貨的文章平臺,使其從小牛歷練到大拿,在架構師的路上一路前行,共學習,共進步;