上一篇文章主要介紹了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,該警告資訊是說在命令列直接輸入密碼是不安全的,這個并不影響查詢結果,可以不用管它,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/62717.html
標籤:MySQL
上一篇:行鎖(7)
下一篇:MySQL優化之索引
