mysql常用命令&架構&引擎
mysql架構四層
mysql架構圖
第一層:
最上層是一些客戶端和連線服務,包含本地sock通訊和基於客戶端、服務端工具實現的類似於tcp/ip通訊。主要完成一些類似於連線處理,授權認證,及相關安全方案。在該層引入執行緒池概念。為通過認證安全接入的客戶端提供執行緒。同樣在該層可以實現基於SSL的安全連結,伺服器也會為安全接入的每個客戶端驗證它具有操作許可權。
Connection Pool
連線池Management Services & Utillties
包括備份,容災恢復,安全,複製,叢集
第二層:
第二層架構主要完成大多核心功能:SQL介面,快取查詢,SQL的分析和優化及部分內建函式執行,所有跨儲存引擎工鞥呢也在這一層
,如過程,函式等。在該層伺服器會解析查詢並建立響應的內部解析樹,並對其完成相應的優化如確定查詢表順序。是否否利用索引等。最後生成相應執行操作。如果select語句,伺服器還會查詢內部的快取,如果快取空間足夠大。這樣在解決大量讀操作環境中能夠很好的提升系統性能。
SQL Interface
SQL介面Parser
解析 通過select,insert命令解析相應操作Optimizer
sql優化器,mysql自己認為最優的優化,因為做sql驗證,至少執行2次。在極端情況下,把此步操作省略,可加快速度
Caches & Buffers
快取和緩衝
第三層:
可拔插元件的引擎。 大部分公司使用
MyISAM
,InnoDB
儲存引擎層,儲存引擎真正的負責MySQL中資料的儲存和提取,伺服器通過API與儲存引擎進行通訊,不同的儲存引擎具有功能不同,這樣我們可以根據自己的實際需要進行選取。
第四層:
資料儲存,主要將資料儲存在運行於裸裝置的檔案系統智商,並完成與儲存引擎的互動
總結
外掛式的儲存引擎架構將查詢處理和其它的系統任務以及資料的儲存提取相分離。這種架構可以根據業務選擇相應儲存引擎。
資料庫儲存引擎
Mysql
中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱作儲存引擎(也稱作表型別)。MySql
MySql
伺服器中啟用。
InnoDB
從 MySQL5.5
(2010年) 版本代替 MyISAM
成為預設引擎,InnoDB
相比MyISAM
更加強調效能,InnoDB 側重於提供事務支援以及外部鍵等高階資料庫功能。
InnoDB特點
-
支援事務。預設的事務隔離級別為可重複讀(
REPEATABLE-READ
),通過MVCC
(併發版本控制)來實現。 -
使用的鎖粒度預設為行級鎖,可以支援更高的併發;當然,也支援表鎖。
-
支援外來鍵約束;外來鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。
-
在InnoDB中存在著緩衝管理,通過緩衝池,將索引和資料全部快取起來,加快查詢的速度
-
可以通過自動增長列,方法是
auto_increment
-
配合一些熱備工具可以支援線上熱備份;
-
InnoDB 表的select count() 比 MyISAM 慢很多;當執行 select count() from t 時,會先把資料讀出來,一行一行的累加,最後返回總數量。 是的,真的會很慢。需要注意的是,當count(*) 語句包含 where 條件時,兩種表的操作是一樣的。
-
對於InnoDB型別的表,其資料的物理組織形式是聚簇表。所有的資料按照主鍵來組織。資料和索引放在一塊,都位於B+數的葉子節點上;
InnoDB儲存表和索引形式
- 共享表空間儲存:所有的表和索引存放在同一個表空間中。
- 多表空間儲存:表結構放在
.frm
檔案,資料和索引放在.ibd
檔案中。分割槽表的話,每個分割槽對應單獨的.ibd
檔案,使用分割槽表的好處在於提升查詢效率
MyISAM特點
- 不支援事務,不支援鎖:在讀寫(Insert、select)效率上,要高於InnoDB不少。場景在:日誌記錄、調查統計表時,絕對值得一用
- 體積小,質量大:MyISAM的索引和資料是分開的,並且索引是有壓縮的,記憶體使用率就對應提高了不少。同時能載入更多索引,而Innodb的索引和資料是緊密捆綁的,沒有使用壓縮從而會造成 Innodb 比 MyISAM 資料檔案體積龐大很多。MyISAM表在磁碟上會對應三個檔案:
.frm檔案:儲存表的定義資料
.MYD檔案:存放表具體記錄的資料
.MYI檔案:儲存索引
- 常常應用部門需要我給他們定期某些表的資料,MyISAM的話很方便,只要發給他們對應那表的(frm.MYD,MYI)的檔案,讓他們自己在對應版本的資料庫啟動就行,而Innodb就需要匯出.sql了,因為光給別人檔案,受字典資料檔案的影響,對方是無法使用的。
- 如果和 MyISAM 比 Insert 寫操作的話,Innodb還達不到MyISAM的寫效能,如果是針對基於索引的update操作,確實MyISAM會慢與InnoDB,但在併發環境下,從庫同步也是個事兒,還不如通過多例項分庫分表架構來解決。
- MyISAM 儲存引擎中,把表的總行數(row)儲存在磁碟上,當執行 select count() from t 時,直接返回總資料。同樣,當 count() 語句包含 where條件時,兩種表的操作是一樣的
mysql常用命令
- 檢視儲存引擎
show engines;
預設支援innoDB引擎,支援事務,行鎖,表鎖
- 檢視預設儲存引擎
show variables like '%storage_engine%';
常用命令:
# 檢視儲存引擎
show engines;
# 檢視預設儲存引擎 注意使用單引號
show variables like '%storage_engine%';
# 檢視所有資料庫
show databases;
# 切換使用資料庫
use music_db;
# 查當前庫中所有表
show tables;
show table status;
#檢視某個表的所有欄位資訊 查表結構
show columns from music_admin;
# 查表結構
describe music_admin;
# 檢視當前使用者許可權列表
show grants;
# 查詢所有自定義函式
show function status ;
# 檢視函式
show create function 函式名;
# 刪除函式
drop function 函式名;
# 清除表中資料 保留自增主鍵
delete from 表名;
# 清除表中資料 不保留自增主鍵,不記錄日誌,不可恢復相當於重新建立表
truncate table 表名;