MyISAM引擎是一種非事務性的引擎,提供高速存儲和檢索,以及全文搜索能力,適合數據倉庫等查詢頻繁的應用。MyISAM中,一個table實際保存爲三個文件,.frm存儲表定義,.MYD存儲數據,.MYI存儲索引。 NULL值被容許在索引的列中。
php
如何查看錶的存儲引擎html
SHOW TABLE STATUS FROM 數據庫 WHERE Name = '表名'mysql
InnoDB:這種類型是事務安全的.它與BDB類型具備相同的特性,它們還支持外鍵.InnoDB表格速度很快.具備比BDB還豐富的特性, 所以若是須要一個事務安全的存儲引擎,建議使用它.若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB 表,InnoDB 給 MySQL 提供了具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in SELECTs)。這些特性均提升了多用戶併發操做的性能表現。在InnoDB表中不須要擴大鎖定(lock escalation),由於 InnoDB 的列鎖定(row level locks)適宜很是小的空間。InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基於磁盤的關係數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 後臺的完整數據庫系統,InnoDB 在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。 InnoDB 把數據和索引存放在表空間裏,可能包含多個文件,這與其它的不同,舉例來講,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小隻受限於操做系統的文件大小,通常爲 2 GB。InnoDB全部的表都保存在同一個數據文件 ibdata1 中(也多是多個文件,或者是獨立的表空間文件),相對來講比較很差備份,免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump。
區別:
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
另外,InnoDB表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」
能夠用 show create table tablename 命令看錶的類型。
2.1 對不支持事務的表作start/commit操做沒有任何效果,在執行commit前已經提交
能夠執行如下命令來切換非事務表到事務(數據不會丟失),innodb表比myisam表更安全:
alter table tablename type=innodb;
算法
MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操做是串行的。那麼,一個進程請求某個MyISAM表的讀鎖,同時另外一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先得到鎖。不只如此,即便讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求以前!這是由於MySQL認爲寫請求通常比讀請求要重要。這也正是MyISAM表不太適合於有大量更新操做和查詢操做應用的緣由,由於,大量的更新操做會形成查詢操做很難得到讀鎖,從而可能永遠阻塞。這種狀況有時可能會變得很是糟糕!myisam是有讀鎖和寫鎖(2個鎖都是表級別鎖)。sql
MySQL表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨佔寫鎖(Table Write Lock)。什麼意思呢,就是說對MyISAM表進行讀操做時,它不會阻塞其餘用戶對同一表的讀請求,但會阻塞 對同一表的寫操做;而對MyISAM表的寫操做,則會阻塞其餘用戶對同一表的讀和寫操做。數據庫
InnoDB行鎖是經過給索引項加鎖來實現的,即只有經過索引條件檢索數據,InnoDB才使用行級鎖,不然將使用表鎖!行級鎖在每次獲取鎖和釋放鎖的操 做須要消耗比表鎖更多的資源。在InnoDB兩個事務發生死鎖的時候,會計算出每一個事務影響的行數,而後回滾行數少的那個事務。當鎖定的場景中不涉及 Innodb的時候,innodb是檢測不到的。只能依靠鎖定超時來解決。緩存
數據庫死鎖例子:安全
兩個sesison,第一個update表t1,不要提交。第二個update表t2,不要提交。接着session1去update表t2,session2去update表t1,此時就發生死鎖了。服務器
冷備份mysql和熱備份mysql:session
冷備份就是直接cp全部的數據庫文件。
熱備份:
1)myisam引擎。一、flush tables with read lock; 二、 cp......; 三、unlock tables;
做爲數據庫服務器的主機,最關鍵的就是主機的總體IO性能,包括磁盤、內存以及各類IO相關的板卡。
在Mysql中,使用orderby 關鍵字,排序方式有兩種:
4.1版本之前的使用的是先取出須要排序的字段和整條記錄的指針,而後對須要排序的字段在指定的排序區進行排序,排序以後,再根據指針去取出相應的記錄。也就是說,這種算法須要訪問數據兩次。從4.1版本開始,採起了改進算法。一次性將全部的符合條件的記錄取出。這樣減小了隨機IO(以前算法排序以後去記錄爲隨機IO)。可是這種改進的方法極大的浪費了排序的時候所使用的內存。因此爲了改進性能,query語句中儘可能只取出咱們須要的字段。
myql的profile能夠用來分析查詢語句的cpu和io的使用狀況。
最基本的咱們能夠從中看出,緩存對於mysql的性能影響。提升速度近30倍