數據庫及SQL優化
一、 MySQL數據庫 - SQL優化
MySQL DBMS - MySQL Database Management System。數據庫管理系統。
一)結構圖
初始化模塊:
安裝數據庫的時候會自動生成多個數據庫模塊,但是主要使用的是mysql
二) MySQL數據庫引擎簡介
1.1 ISAM(Indexed Sequential Access Method)
ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之時就考慮到數據庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不占用大量的內存和存儲資源。
註意:使用ISAM註意點:必須經常備份所有實時數據。
1.2 MyISAM
MyISAM是MySQL的ISAM擴展格式(MySQL5.5之前版本的缺省數據庫引擎)數據庫引擎。除了提供ISAM裏所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個並發的讀寫操作,其代價是你需要經常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。
MyISAM引擎使用註意:必須經常使用Optimize Table命令清理空間;必須經常備份所有實時數據。工具有用來修復數據庫文件的MyISAMCHK工具和用來恢復浪費空間的 MyISAMPACK
如果使用該數據庫引擎,會生成三個文件:
.frm:表結構信息
.MYD:數據文件
.MYI:表的索引信息
1.3 InnoDB
InnoDB數據庫引擎都是造就MySQL靈活性的技術的直接產品,這項技術就是MYSQL++ API。在使用MYSQL的時候,你所面對的每一個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理(transaction process)也不支持外鍵。盡管要比ISAM和MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。是現在的MySQL(5.5以上版本)常用版本默認引擎
MySQL 官方對InnoDB是這樣解釋的:InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級並且也在SELECT語句提供一個Oracle風格一致的非鎖定讀,這些特色增加了多用戶部署的性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。
InnoDB是為處理巨大數據量時的最大性能設計,它的CPU效率可能是任何其它基於磁盤的關系數據庫引擎所不能匹敵的。
InnoDB存儲引擎被完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上。
在MySQL5.7版本中,InnoDB存儲引擎管理的數據文件為兩個:分別是frm,idb文件。
InnoDB特點:
1)、支持事務
2)、數據多版本讀取(InnoDB+MyISAM+ISAM)
3)、鎖定機制的改進
4)、實現外鍵
1.3.1 innodb與myisam區別
1. InnoDB支持事務,MyISAM不支持,對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin transaction和commit之間,組成一個事務;
2. InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB表轉為MYISAM會失敗;
3. InnoDB是聚集索引,數據文件是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
4. InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;
5. Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;
1.3.2 如何選擇
1. 是否要支持事務,如果要請選擇innodb,如果不需要可以考慮MyISAM
2. 如果表中絕大多數都只是讀查詢,可以考慮MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。
3. 系統崩潰後,MyISAM恢復起來更困難,能否接受;
4. MySQL5.5版本開始Innodb已經成為Mysql的默認引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麽,那就用InnoDB,至少不會差。
1.4 Memory存儲引擎
Memory存儲引擎,通過名字就很容易讓人知道,他是一個將數據存儲在內存中的存儲引擎。Memory存儲引擎不會將任何數據存放到磁盤上,僅僅存放了一個表結構相關信息的.frm文件在磁盤上面。所以一旦MySQLCrash或者主機Crash之後,Memory的表就只剩下一個結構了。Memory表支持索引,並且同時支持Hash和B-Tree兩種格式的索引。由於是存放在內存中,所以Memory都是按照定長的空間來存儲數據的,而且不支持BLOB和TEXT類型的字段。Memory存儲引擎實現頁級鎖定。
1.5 NDBCluster存儲引擎
NDB存儲引擎也叫NDBCluster存儲引擎,主要用於MySQLCluster分布式集群環境,Cluster是MySQL從5.0版本才開始提供的新功能。
1.6 Merge存儲引擎
MERGE存儲引擎,在MySQL用戶手冊中也提到了,也被大家認識為MRG_MyISAM引擎。Why?因為MERGE存儲引擎可以簡單的理解為其功能就是實現了對結構相同的MyISAM表,通過一些特殊的包裝對外提供一個單一的訪問入口,以達到減小應用的復雜度的目的。要創建MERGE表,不僅僅基表的結構要完全一致,包括字段的順序,基表的索引也必須完全一致。BDB存儲引擎
BDB存儲引擎全稱為BerkeleyDB存儲引擎,和Innodb一樣,也不是MySQL自己開發實現的一個存儲引擎,而是由SleepycatSoftware所提供,當然,也是開源存儲引擎,同樣支持事務安全。
1.7 FEDERATED存儲引擎
FEDERATED存儲引擎所實現的功能,和Oracle的DBLINK基本相似,主要用來提供對遠程MySQL服務器上面的數據的訪問接口。如果我們使用源碼編譯來安裝MySQL,那麽必須手工指定啟用FEDERATED存儲引擎才行,因為MySQL默認是不起用該存儲引擎的。
1.8 ARCHIVE存儲引擎
ARCHIVE存儲引擎主要用於通過較小的存儲空間來存放過期的很少訪問的歷史數據。ARCHIVE表不支持索引,通過一個.frm的結構定義文件,一個.ARZ的數據壓縮文件還有一個.ARM的meta信息文件。由於其所存放的數據的特殊性,ARCHIVE表不支持刪除,修改操
作,僅支持插入和查詢操作。鎖定機制為行級鎖定。
1.9 BLACKHOLE存儲引擎
BLACKHOLE存儲引擎是一個非常有意思的存儲引擎,功能恰如其名,就是一個“黑洞”。就像我們unix系統下面的“/dev/null”設備一樣,不管我們寫入任何信息,都是有去無回。
1.10 CSV存儲引擎
CSV存儲引擎實際上操作的就是一個標準的CSV文件,他不支持索引。起主要用途就是大家有些時候可能會需要通過數據庫中的數據導出成一份報表文件,而CSV文件是很多軟件都支持的一種較為標準的格式,所以我們可以通過先在數據庫中建立一張CSV表,然後將生成的報表信息插入到該表,即可得到一份CSV報表文件了。
補充知識:
查看數據庫物理地址:
命令行:show
global
variables
like
"%datadir%"
;
方式一:使用mysql客戶端:
方式二:使用第三方客戶端:
註意:
數據庫及SQL優化