上一篇文章主要介紹了MySQL在Ubuntu18.04系統上的安裝,以及安裝過程中可能會遇到的一些問題的解決方案。 在這篇文章里,開始介紹MySQL資料庫的邏輯分層。通過本文的介紹,可以大致瞭解到MySQL的語句從客戶端發出請求後,在伺服器經歷了怎樣的過程。有助於後面MySQL優化的加深理解。 My ...
上一篇文章主要介紹了MySQL在Ubuntu18.04系統上的安裝,以及安裝過程中可能會遇到的一些問題的解決方案。
在這篇文章里,開始介紹MySQL資料庫的邏輯分層。通過本文的介紹,可以大致瞭解到MySQL的語句從客戶端發出請求後,在伺服器經歷了怎樣的過程。有助於後面MySQL優化的加深理解。
MySQL邏輯分層
一般來說,MySQL邏輯可分為四個層次,分別為:連接層,服務層,引擎層,存儲層 。
連接層
提供與客戶端連接的服務。
當客戶端發出一個請求後(如增刪改查的SQL語句),首先到達該層,將伺服器與客戶端建立連接。
服務層
服務層分兩個作用:
- 提供各種用戶使用的介面。 如
select
、insert
等 - 提供SQL優化器(MySQL Query Optimizer)。 SQL優化器是MySQL服務層自帶的一個服務,它會自動優化用戶寫得不是最優的SQL,使其達到優化的效果。但由於優化器畢竟只是優化器,有時候會將用戶自定義的優化方案給更改掉,從而使用戶自己的優化方案失效,這一點需要註意。
引擎層
引擎層提供各種數據存儲的方式。MySQL的存儲引擎有很多,比較常用的比如有InnoDB
, MyISAM
。
InnoDB與MyISAM的區別為:
- InnoDB 事務優先,所以適合高併發操作,使用的是行鎖
- MyISAM 性能優先,適合查詢多的場景,使用的是表鎖
查詢資料庫支持哪些引擎的SQL:
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)
從上面結果可知,MySQL5.7預設的引擎是InnoDB
(DEFAULT),除了FEDERATED
之外的引擎都支持。
查看當前資料庫使用的引擎:
mysql> show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name | Value |
+----------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
4 rows in set (0.00 sec)
指定資料庫對象的引擎:
一般是指定某一張表使用哪個引擎,因為MySQL的表都要依賴於database,所以在此之前,先創建一個database,如:
mysql> create database testDB;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testDB |
+--------------------+
5 rows in set (0.00 sec)
如上,就創建成功了一個名為testDB
的資料庫,接下來該系列文章的所有演示,都在testDB
中進行。
下麵,就在testDB
中創建一張名為tbl_A的表,表中有三個欄位,分別為id(int 型,自增,主鍵),name(varchar型,長度為20),descript(varchar型,長度為80)。指定存儲引擎為MyISAM
。
mysql> use testDB;
Database changed
mysql> create table tbl_A(
-> id int(4) auto_increment,
-> name varchar(20),
-> descript varchar(80),
-> primary key(id)
-> )ENGINE=MyISAM;
Query OK, 0 rows affected (0.04 sec)
如上所示,MyISAM引擎的表就建成了。
存儲層
最終的數據存儲在存儲層。
配置在終端直接操作MySQL
我們每次操作資料庫,都要完成以下步驟,先使用mysql -uroot -p
登錄到客戶端,然後指定資料庫,然後才能在資料庫里對錶進行操作,顯得比較繁瑣,因此,可以定義一個別名,完成以上操作,在之後的操作中,直接使用該別名在終端操作即可,不需要每次都進入MySQL客戶端。
如:我們將該別名定義為isql_s
,在該命令後直接跟上SQL語句即可操作。配置方法如下:
先使用vim編輯器打開~/.bashrc,然後在最下麵加上如下一句話:
alias isql_s='mysql -uroot -pcyc2010 -P3306 -DtestDB --auto-rehash -A -e'
以上命令的意思是,定義一個叫isql_s
的別名,代替mysql -uroot -pcyc2010 -P3306 -DtestDB --auto-rehash -A -e
命令。
- 該命令指定
mysql
用戶為root
; -p
後面跟的是root
用戶密碼;-P
後面是埠號,如果是本地的話,預設為3306
;(註意大小寫,和密碼的區別)-D
後面是database
的名字,我這裡指定的是testDB
;--auto-rehash
是自動補全,這個加不加無所謂;-A
代表不預讀資料庫信息,因為當資料庫中表特別多時,預讀資料庫信息會使得打開資料庫特別慢,有了這個參數,就可以提高打開效率。-e
代表後面可以直接跟SQL語句。
見如下圖120行所示:
配置完成後,按:wq!
命令退出編輯器,然後使用如下命令,使配置參數生效:
$ . ~/.bashrc
接下來,就可以演示一下,如何使用isql_s
命令直接訪問資料庫了。比如我要查本文建的表tbl_A的表結構:
chenyc@DESKTOP-Q5J25HR:~$ isql_s "desc tbl_A"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| descript | varchar(80) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
可以看到,直接就能查詢出來,而不需要重新進入資料庫,指定database等一系列繁瑣的操作。
使用以上命令時,可以看到一句Warning
,該警告信息是說在命令行直接輸入密碼是不安全的,這個並不影響查詢結果,可以不用管它。