mysql內部組件架構,索引管理,視圖view

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;


視圖能插入數據嗎?

可以,往視圖中插入數據,其實是插入到基表中,所以能否插入成功取決於基表對字段的約束。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章