mysql系列(三)——mysql架構與存儲引擎

一、MySql邏輯架構

1.連接層

2.SQL服務層

  1. 組成部分
(1)Sql Interface: 處理sql命令的接收及結果的返回
(2)Parser: 解析器,解析sql
(3)Optimizer: 優化器,優化sql
(4)Caches&Buffer: 緩存
  1. 查詢命令的執行流程
  2. 解析器
  3. 優化器

explain SQL查詢語句 :查看查詢計劃

  1. 緩存

sql的緩存是默認的,數據緩存需要手動開啓(在my.cnf(linux)文件中配置)

//  查看緩存是否開啓
show variables like '%query_cache_type%'
// 設置緩存大小
SET GLOBAL query_cache_size = 4000;
SET GLOBAL query_cache_size = 134217728;

3. 引擎層

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
  1. MyISAM
  • (1)MyISAM是Mysql5.5之前建表的默認引擎
  • (2)MyISAM創建表示創建的文件有三種如下案例
mysql> create table t1(id int)ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
======================
[root@192 mysql]# ll
......
drwxr-x---. 2 mysql mysql       62 Jul  5 01:47 test
[root@192 mysql]# cd test/
[root@192 test]# ll
total 20
-rw-r-----. 1 mysql mysql   65 Jul  5 01:32 db.opt
-rw-r-----. 1 mysql mysql 8556 Jul  5 01:47 t1.frm
-rw-r-----. 1 mysql mysql    0 Jul  5 01:47 t1.MYD
-rw-r-----. 1 mysql mysql 1024 Jul  5 01:47 t1.MYI
.frm文件: 存儲表結構的文件,任何引擎都有的文件
.MYD文件: 存儲庫數據的文件
.MYI文件: 存儲索引的文件
  • (3)特性
--併發性及鎖級別:表鎖
--支持全文索引
--支持數據壓縮
		myisampack -b -f tableName.MYI
  • (4)適合場景
--支持非事務場景(數據倉庫、報表、日誌數據)
--只讀類應用
--空間類應用(空間函數、座標)
  1. Innodb
  • (1)Innodb是Mysql5.5以後建表的默認引擎
  • (2)innodb_file_per_table
mysql> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)
====================================
----ON  :  獨立表空間(Mysql5.6及以後默認獨立表空間)
----OFF  : 系統表空間
===================================
案例一:驗證獨立表空間(獨立表空間在目錄下生成".frm"文件和".idb"文件)
	mysql> use test;
	Database changed
	mysql> set global innodb_file_per_table=1;
	Query OK, 0 rows affected (0.00 sec)

	mysql> create table t2(id int,name varchar(100));
	Query OK, 0 rows affected (0.03 sec)

	mysql> show variables like '%datadir%';
	+---------------+-----------------+
	| Variable_name | Value           |
	+---------------+-----------------+
	| datadir       | /var/lib/mysql/ |
	+---------------+-----------------+
	1 row in set (0.00 sec)
---------------------------------------------------------
	[root@192 ~]# cd /var/lib/mysql/
	[root@192 mysql]# ll
	.......
	drwxr-x---. 2 mysql mysql       90 Jul  5 05:04 test
	[root@192 mysql]# cd test
	[root@192 test]# ll
	total 128
	....... ( /var/lib/mysql/test)
	-rw-r-----. 1 mysql mysql  8586 Jul  5 05:04 t2.frm
	-rw-r-----. 1 mysql mysql 98304 Jul  5 05:04 t2.ibd
案例二:驗證系統表空間(在/var/lib/mysql 下生成共有的文件ibdataX,在/var/lib/mysql/test 下生成.frm文件)
	mysql> use test
	Database changed
	mysql> set global innodb_file_per_table=0;
	Query OK, 0 rows affected (0.00 sec)
---------------------------------------------------------
	mysql> create table t3(id int,name varchar(100));
	Query OK, 0 rows affected (0.01 sec)

	[root@192 test]# pwd
	/var/lib/mysql/test
	[root@192 test]# ll
	......
	-rw-r-----. 1 mysql mysql  8586 Jul  5 05:08 t3.frm
	[root@192 test]# cd ../
	[root@192 mysql]# ll
	total 188488
	......
	-rw-r-----. 1 mysql mysql 79691776 Jul  5 05:09 ibdata1
	......
	[root@192 mysql]# pwd
	/var/lib/mysql
  • (3)系統表空間和獨立表空間區別
1. 系統表空間無法簡單的收縮表空間的大小
2. 獨立表空間可以通過optimize tableName收縮文件大小
3. 系統表空間會產生IO瓶頸
4. 獨立表空間可以向多個文件刷新數據
  • (4)特性
1. Innodb是一種事務性存儲引擎
2.完全支持事務ACID的特性
3. Redo log和Undo log
4. Innodb支持行級鎖(併發程度更高)
  • (5)適合場景
有事務處理的業務(OLTP)
  • (6)MyISAM與Innodb的比較
對比項 MyISAM InnoDB
主外鍵 不支持 支持
事務 不支持 支持
行表鎖 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作行 行鎖,操作時只鎖某一行,不對其它行有影響;適合高併發的操作
緩存 只緩存索引,不緩存真實數據 不僅緩存索引還要緩存真實數據,對內存要求較高,而且內存大小對性能有決定性的影響
表空間
關注點 性能 事務
默認安裝 Y Y

4 存儲層

數據文件及日誌文件


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