mysql內部組件架構,索引管理,視圖view
——以下內容摘自馬哥教育課堂
===
單進程多線程模型
每個用戶連接都使用一個線程
mysql使用線程池來管理各個線程
mysql內部組件架構
connection
--management service & unities(管理服務單元,如備份恢復,集羣,合併,遷移工具,複製工具);
connection pool(認證,線程重用,連接限制,內存檢查,緩存);
--SQL接口(DML,DDL,存儲過程,視圖,觸發器);
分析器parser(查詢翻譯成二進制指令,訪問權限);
優化器optimizer(文件系統的訪問路徑,統計數據);
緩存cache和緩衝buffer;
--存儲引擎myisam,innodb,...
--文件系統,文件和日誌(數據,索引,二進制日誌,重做日誌,撤銷日誌,錯誤日誌,中繼日誌 )
mysql的某些存儲引擎,可以把熱點數據直接裝入內存中,加速數據的訪問,週期性同步到磁盤上(innodb可以實現)
mysql內部的工作流程(簡化)
用戶--[連接管理器--線程管理器]--用戶模塊--命令派發器--查詢緩存(sql-value),記錄日誌;分析器--[優化器(sql語句),表修改模塊,表維護模塊,複製模塊,狀態報告模塊]--訪問控制模塊--表管理器--存儲引擎接口--myisam,innodb
mysql邏輯架構(簡化版)
客戶端--連接/線程處理--查詢緩存,分析器--優化器--存儲引擎--文件系統
===
索引管理
索引:按照特定數據結構存儲的索引,特別適合某些算法快速執行。索引構建於內存中並排好序,可利用搜索算法快速定位某項或若干項,定位後,通過存儲引擎到磁盤上加載索引項指向數據行到內存中即可。
沒有索引就只能表掃描,把整張表數據從磁盤加載到內存中,再一行行比對操作,這顯然費時費力。
索引構建原理
抽取表中某個字段做排序後單獨存放爲整字段索引中,然後,在此基礎之上構建一個稀疏索引,比如分爲四段索引A-H,I-M,O-T,U-Z分別映射到整字段索引中,如果要查找蘋果,則會把O-T的字段加載到內存中查找即可。
B+樹索引--多級稀疏格式索引來構建
索引類型:
聚集索引,非聚集索引:數據是否與索引存儲在一起
主鍵索引,輔助索引:主鍵索引可實現一對一查詢,輔助索引通常用於輔助其他查詢操作
稠密索引,稀疏索引:索引是否索引了每個數據項
B+樹索引,HASH索引(一對一查找),R樹索引,全文索引:不同的索引數據結構
單鍵索引,組合索引:索引由一個字段還是多個字段來構建
mysql使用左前綴索引:LIKE 'ABC%'
弊端:LIKE '%abc00'就不能使用索引了
覆蓋索引:例如在組合索引的場景中,在索引的基礎上就找到需要查詢的結果了,而無需再加載表數據的方式稱作覆蓋索引。
如何管理和使用索引
創建索引:創建表時指定,也可以單獨創建
HELP CREATE TABLE
HELP CREATE INDEX;HELP DROP INDEX
索引沒必要修改,只有創建/刪除
在一張大表中不要隨意創建/刪除索引,非常耗費資源
操作演示
# mysql < hellodb.sql
> USE hellodb
> SHOW TABLES;
> SELECT * FROM classes;
> HELP SHOW INDEX
> SHOW INDEXES FROM students;
結果顯示在StuID上建立了索引
> SELECT * FROM students WHERE StuID=3;
> EXPLAIN SELECT * FROM students WHERE StuID=3\G
結果顯示,使用了索引,只查詢了1行即命中結果
> EXPLAIN SELECT * FROM students WHERE Age=9\G
結果顯示,沒有使用索引,需要查詢25行
> HELP ALTER TABLE
> ALTER TABLE students ADD INDEX(Age);
此時修改表,添加索引創建在Age字段上
> SHOW INDEXES FROM students;
結果顯示在StuID,Age上建立了索引
> EXPLAIN SELECT * FROM students WHERE Age=9\G
結果顯示,使用索引,需要查詢1行
> CREATE INDEX name ON students (Name);
> SHOW INDEXES FROM students;
此時,該表有3個索引,都是BTREE索引
> EXPLAIN SELECT * FROM students WHERE Name LIKE 'X%'\G
結果顯示,過濾了6行,使用了索引
> EXPLAIN SELECT * FROM students WHERE Name LIKE '%X'\G
結果顯示,沒有使用索引,全表掃描
===
視圖view
視圖是虛表,是存儲下來的SELECT語句
創建視圖 HELP CREATE VIEW;
mysql的視圖不完善?
霧化視圖:把select語句的執行結果永久保存下來
> CREATE VIEW test AS SELECT StuID,Name,Age, FROM students;
> SHOW TABLES;
可以看到test表
> SHOW TABLES STATUS LIKE 'test'\G;
大部分提示NULL,comment提示VIEW
> SELECT * FROM test;
> SELECT * FROM test WHERE Age=22;
> EXPLAIN SELECT * FROM test WHERE Age=22;
同樣可以使用索引Age
刪除視圖 HELP DROP VIEW;
視圖能插入數據嗎?
可以,往視圖中插入數據,其實是插入到基表中,所以能否插入成功取決於基表對字段的約束。