上一篇文章主要介紹了MySQL在Ubuntu18.04系統(tǒng)上的安裝,以及安裝過(guò)程中可能會(huì)遇到的一些問(wèn)題的解決方案。
在這篇文章里,開(kāi)始介紹MySQL數(shù)據(jù)庫(kù)的邏輯分層。通過(guò)本文的介紹,可以大致了解到MySQL的語(yǔ)句從客戶端發(fā)出請(qǐng)求后,在服務(wù)器經(jīng)歷了怎樣的過(guò)程。有助于后面MySQL優(yōu)化的加深理解。
MySQL邏輯分層
一般來(lái)說(shuō),MySQL邏輯可分為四個(gè)層次,分別為:連接層,服務(wù)層,引擎層,存儲(chǔ)層 。
連接層
提供與客戶端連接的服務(wù)。
當(dāng)客戶端發(fā)出一個(gè)請(qǐng)求后(如增刪改查的SQL語(yǔ)句),首先到達(dá)該層,將服務(wù)器與客戶端建立連接。
服務(wù)層
服務(wù)層分兩個(gè)作用:
- 提供各種用戶使用的接口。 如
select 、insert 等
- 提供SQL優(yōu)化器(MySQL Query Optimizer)。 SQL優(yōu)化器是MySQL服務(wù)層自帶的一個(gè)服務(wù),它會(huì)自動(dòng)優(yōu)化用戶寫(xiě)得不是最優(yōu)的SQL,使其達(dá)到優(yōu)化的效果。但由于優(yōu)化器畢竟只是優(yōu)化器,有時(shí)候會(huì)將用戶自定義的優(yōu)化方案給更改掉,從而使用戶自己的優(yōu)化方案失效,這一點(diǎn)需要注意。
引擎層
引擎層提供各種數(shù)據(jù)存儲(chǔ)的方式。MySQL的存儲(chǔ)引擎有很多,比較常用的比如有InnoDB , MyISAM 。
InnoDB與MyISAM的區(qū)別為:
- InnoDB 事務(wù)優(yōu)先,所以適合高并發(fā)操作,使用的是行鎖
- MyISAM 性能優(yōu)先,適合查詢多的場(chǎng)景,使用的是表鎖
查詢數(shù)據(jù)庫(kù)支持哪些引擎的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)
從上面結(jié)果可知,MySQL5.7默認(rèn)的引擎是InnoDB (DEFAULT),除了FEDERATED 之外的引擎都支持。
查看當(dāng)前數(shù)據(jù)庫(kù)使用的引擎:
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)
指定數(shù)據(jù)庫(kù)對(duì)象的引擎:
一般是指定某一張表使用哪個(gè)引擎,因?yàn)镸ySQL的表都要依賴于database,所以在此之前,先創(chuàng)建一個(gè)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)
如上,就創(chuàng)建成功了一個(gè)名為testDB 的數(shù)據(jù)庫(kù),接下來(lái)該系列文章的所有演示,都在testDB 中進(jìn)行。
下面,就在testDB 中創(chuàng)建一張名為tbl_A的表,表中有三個(gè)字段,分別為id(int 型,自增,主鍵),name(varchar型,長(zhǎng)度為20),descript(varchar型,長(zhǎng)度為80)。指定存儲(chǔ)引擎為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引擎的表就建成了。
存儲(chǔ)層
最終的數(shù)據(jù)存儲(chǔ)在存儲(chǔ)層。
配置在終端直接操作MySQL
我們每次操作數(shù)據(jù)庫(kù),都要完成以下步驟,先使用mysql -uroot -p 登錄到客戶端,然后指定數(shù)據(jù)庫(kù),然后才能在數(shù)據(jù)庫(kù)里對(duì)表進(jìn)行操作,顯得比較繁瑣,因此,可以定義一個(gè)別名,完成以上操作,在之后的操作中,直接使用該別名在終端操作即可,不需要每次都進(jìn)入MySQL客戶端。
如:我們將該別名定義為isql_s ,在該命令后直接跟上SQL語(yǔ)句即可操作。配置方法如下:
先使用vim編輯器打開(kāi)~/.bashrc,然后在最下面加上如下一句話:
alias isql_s='mysql -uroot -pcyc2010 -P3306 -DtestDB --auto-rehash -A -e'
以上命令的意思是,定義一個(gè)叫isql_s 的別名,代替mysql -uroot -pcyc2010 -P3306 -DtestDB --auto-rehash -A -e 命令。
- 該命令指定
mysql 用戶為root ;
-p 后面跟的是root 用戶密碼;
-P 后面是端口號(hào),如果是本地的話,默認(rèn)為3306 ;(注意大小寫(xiě),和密碼的區(qū)別)
-D 后面是database 的名字,我這里指定的是testDB ;
--auto-rehash 是自動(dòng)補(bǔ)全,這個(gè)加不加無(wú)所謂;
-A 代表不預(yù)讀數(shù)據(jù)庫(kù)信息,因?yàn)楫?dāng)數(shù)據(jù)庫(kù)中表特別多時(shí),預(yù)讀數(shù)據(jù)庫(kù)信息會(huì)使得打開(kāi)數(shù)據(jù)庫(kù)特別慢,有了這個(gè)參數(shù),就可以提高打開(kāi)效率。
-e 代表后面可以直接跟SQL語(yǔ)句。
見(jiàn)如下圖120行所示:

配置完成后,按:wq! 命令退出編輯器,然后使用如下命令,使配置參數(shù)生效:
$ . ~/.bashrc
接下來(lái),就可以演示一下,如何使用isql_s 命令直接訪問(wèn)數(shù)據(jù)庫(kù)了。比如我要查本文建的表tbl_A的表結(jié)構(gòu):
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 | |
+----------+-------------+------+-----+---------+----------------+
可以看到,直接就能查詢出來(lái),而不需要重新進(jìn)入數(shù)據(jù)庫(kù),指定database等一系列繁瑣的操作。
使用以上命令時(shí),可以看到一句Warning ,該警告信息是說(shuō)在命令行直接輸入密碼是不安全的,這個(gè)并不影響查詢結(jié)果,可以不用管它。
|