? 前面的文章已經(jīng)介紹了MySQL的索引與事務(wù)以及MySQL的備份與恢復(fù)的相關(guān)的內(nèi)容,本文將對(duì)MySQL視圖及存儲(chǔ)過程以及存儲(chǔ)引擎進(jìn)行講述。
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、岳陽縣網(wǎng)絡(luò)推廣、成都小程序開發(fā)、岳陽縣網(wǎng)絡(luò)營(yíng)銷、岳陽縣企業(yè)策劃、岳陽縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供岳陽縣建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
? 我們?cè)谑褂肧QL語句進(jìn)行多表查詢的時(shí)候的命令是非常冗長(zhǎng)而麻煩的,如果說這樣的操作還非常多的使用的情況下就會(huì)加大工作人員的工作量,畢竟不能保證如此長(zhǎng)的代碼不會(huì)寫錯(cuò),并且多次進(jìn)行如此復(fù)雜的查詢也會(huì)造成服務(wù)器資源占用比變大的問題,那么我們有什么好的辦法解決這樣的問題呢?
? 其實(shí),我們可以將這些需要經(jīng)常查詢的數(shù)據(jù)內(nèi)容(可能存在于多個(gè)表中)進(jìn)行匯總到一個(gè)虛擬的表中,既方便了工作人員查詢,也減輕了服務(wù)器的負(fù)擔(dān),并且在節(jié)約磁盤空間的同時(shí)也可以支持?jǐn)?shù)據(jù)的動(dòng)態(tài)變化,而這樣的表就是“視圖”。
? 其實(shí)視圖是一種邏輯表,本身并不存放數(shù)據(jù)。而是作為一個(gè)select語句保存咋數(shù)據(jù)字典(可以理解為一個(gè)容器)中。通過視圖,可以展現(xiàn)基表的備份數(shù)據(jù);視圖數(shù)據(jù)來自定義視圖的查詢中使用的表,使用視圖動(dòng)態(tài)生成。
基表:用來創(chuàng)建視圖的表base table
?
視圖所占資源較少,就好比是水中月,實(shí)際并不存在,但是會(huì)根據(jù)基表的變化而產(chǎn)生變化。
優(yōu)點(diǎn):
? 1)簡(jiǎn)單:使用視圖的用戶完全不需要關(guān)心后面對(duì)應(yīng)的表的結(jié)構(gòu)、關(guān)聯(lián)條件和篩選條件,對(duì)用戶來說已經(jīng)是過濾好的復(fù)合條件的結(jié)果集。
? 2)安全:使用視圖的用戶只能訪問他們被允許查詢的結(jié)果集,對(duì)表的權(quán)限管理并不能限制到某個(gè)行某個(gè)列,但是通過視圖就可以簡(jiǎn)單的實(shí)現(xiàn)。
? 3)數(shù)據(jù)獨(dú)立:一旦視圖的結(jié)構(gòu)確定了,可以屏蔽表結(jié)構(gòu)變化對(duì)用戶的影響,源表增加列對(duì)視圖沒有影響;源表修改列名,則可以通過修改視圖來解決,不會(huì)造成對(duì)訪問者的影響。
? 總而言之,使用視圖的大部分情況是為了保障數(shù)據(jù)安全性,提高查詢效率。
缺點(diǎn):
? 1)性能差:數(shù)據(jù)庫必須把視圖查詢轉(zhuǎn)化成對(duì)基本表的查詢,如果這個(gè)視圖是由一個(gè)復(fù)雜的多表查詢所定義,那么,即使是視圖的一個(gè)簡(jiǎn)單查詢,數(shù)據(jù)庫也要把它變成一個(gè)復(fù)雜的結(jié)合體,需要花費(fèi)一定的時(shí)間。
? 2)修改限制:當(dāng)用戶試圖修改視圖的某些信息時(shí),數(shù)據(jù)庫必須把它轉(zhuǎn)化為對(duì)基本表的某些信息的修改,對(duì)于簡(jiǎn)單的視圖來說,這是很方便的,但是,對(duì)于比較復(fù)雜的試圖,可能是不可修改的。
? 對(duì)于視圖的算法,簡(jiǎn)單介紹一下,我們需要在創(chuàng)建視圖的時(shí)候指定,基本語法:
create + [algorithm = temptable/merge/undefined] + view + 視圖名 + as + select語句 with check option;
視圖算法,即系統(tǒng)對(duì)視圖以及外部查詢視圖的select語句的一種解析方式。視圖算法有三種,分別為:
創(chuàng)建一般視圖命令格式:
create view 視圖名稱 as select +內(nèi)容
? 簡(jiǎn)單的說,就是一組SQL語句集,功能強(qiáng)大,可以實(shí)現(xiàn)一些比較復(fù)雜的邏輯功能,類似于JAVA語言中的方法;
? 備注:存儲(chǔ)過程跟觸發(fā)器有點(diǎn)類似,都是一組SQL集,但是存儲(chǔ)過程是主動(dòng)調(diào)用的,且功能比觸發(fā)器更加強(qiáng)大,觸發(fā)器是某件事觸發(fā)后自動(dòng)調(diào)用;
? 有輸入輸出參數(shù),可以聲明變量,有if/else, case,while等控制語句,通過編寫存儲(chǔ)過程,可以實(shí)現(xiàn)復(fù)雜的邏輯功能;
? 函數(shù)的普遍特性:模塊化,封裝,代碼復(fù)用;
? 速度快,只有首次執(zhí)行需經(jīng)過編譯和優(yōu)化步驟,后續(xù)被調(diào)用可以直接執(zhí)行,省去以上步驟;
? MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件或者內(nèi)存中。而這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并最終提供廣泛的不同的功能和能力。
? 這些不同的技術(shù)以及與之相應(yīng)的相關(guān)功能在MySQL中被稱作為“存儲(chǔ)引擎”。MySQL提供了多個(gè)不同的存儲(chǔ)引擎,可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用。
以上主要由6部分組成,主要有各種組件以及存儲(chǔ)引擎和文件系統(tǒng)。我們做簡(jiǎn)單的介紹
Connectors:連接組件,需要有驅(qū)動(dòng)支持;主要用于使用不同的語言代碼程序和MySQL的交互
Connection Pool:連接池組件;主要是管理、緩沖用戶的連接,線程處理等需要緩存的需求
Management Service & Utilities:管理服務(wù)與工具組件;例如進(jìn)行備份恢復(fù)、MySQL復(fù)制、集群等;
SQL Interface:SQL接口;主要接受用戶的SQL命令語句,并且返回用戶需要查詢的結(jié)果;
Parser:查詢解析器;當(dāng)SQL命令語句傳遞到解析器的時(shí)候會(huì)被解析器驗(yàn)證和解析(權(quán)限、語法結(jié)構(gòu));
Optimizer:查詢優(yōu)化器;SQL語句在執(zhí)行之前使用查詢優(yōu)化器對(duì)查詢進(jìn)行優(yōu)化;舉個(gè)例子:
select id,name from where hobby = ‘read’;
1)這個(gè)select語句查詢會(huì)先根據(jù)where語句進(jìn)行選??;
2)其次根據(jù)id和name進(jìn)行屬性投影;
3)結(jié)合兩個(gè)查詢條件輸出最終的查詢結(jié)果
Caches & Buffers:緩存;當(dāng)查詢緩存中有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù);
Plugggable Storage Engines:插入式存儲(chǔ)引擎;是為了管理操作數(shù)據(jù)(存儲(chǔ)、更新、查詢數(shù)據(jù)的方法方式)
? MyISAM存儲(chǔ)引擎是MySQL數(shù)據(jù)庫系統(tǒng)5.5版本之前的默認(rèn)存儲(chǔ)引擎??紤]到的問題是:查詢的次數(shù)遠(yuǎn)遠(yuǎn)大于更新的次數(shù),因此需要執(zhí)行讀取操作數(shù)據(jù)速度比較快,并且不需要占用大量的內(nèi)存和存儲(chǔ)資源。
? MyISAM管理非事務(wù)表,提供索引和字段管理,且擁有表格鎖定機(jī)制從而優(yōu)化多個(gè)并發(fā)的讀寫操作。
不支持事務(wù);
表格鎖定機(jī)制,數(shù)據(jù)在更新時(shí)鎖定整個(gè)表;
數(shù)據(jù)庫在讀寫過程中互相阻塞;
可以通過key_buffer_size來設(shè)置緩存索引,提高訪問性能,減少磁盤IO讀寫壓力
速度快且占用資源少;
不支持外鍵約束,只支持全文索引;
存儲(chǔ)文件為
1).frm 文件存儲(chǔ)表定義;
2).MYD 數(shù)據(jù)文件擴(kuò)展名
3).MYI 索引文件擴(kuò)展名
? InnoDB存儲(chǔ)引擎是MySQL數(shù)據(jù)庫系統(tǒng)535版本之后的默認(rèn)存儲(chǔ)引擎,是為了解決或者優(yōu)化MyISAM存儲(chǔ)引擎不足之處而產(chǎn)生的。
? 可以這么說,InnoDB存儲(chǔ)引擎是為處理巨大數(shù)據(jù)量時(shí)的最大性能而設(shè)計(jì)的。
根據(jù)需求選擇適合的存儲(chǔ)引擎,然后考慮如何修改;
(1)查看數(shù)據(jù)庫可以配置的存儲(chǔ)引擎類型;
(2)查看表正在使用的存儲(chǔ)引擎類型;
(3)配置存儲(chǔ)引擎為所選擇的類型
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)
Engine列表示當(dāng)前版本的MySQL所支持的引擎類型;
Support列表示對(duì)應(yīng)引擎是否可以使用,DEFAULT表示默認(rèn)使用的類型此版本(MySQL5.7.17)是InnoDB;
Transactions列表示對(duì)應(yīng)引擎是否支持事務(wù);
mysql> show table status from student where name = 'info';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| info | InnoDB | 10 | Dynamic | 4 | 4096 | 16384 | 0 | 0 | 0 | 5 | 2020-01-08 19:47:38 | NULL | NULL | utf8_general_ci | NULL | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.01 sec)
或者使用create命令也可以查看表的存儲(chǔ)引擎
mysql> show create table info;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info | CREATE TABLE "info" (
"id" int(3) NOT NULL AUTO_INCREMENT,
"name" varchar(6) DEFAULT NULL,
"score" decimal(5,2) DEFAULT NULL,
PRIMARY KEY ("id")
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
使用alter命令:alter table 表名 engine= 引擎名稱
mysql> alter table info engine=Myisam;
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> show create table info;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info | CREATE TABLE "info" (
"id" int(3) NOT NULL AUTO_INCREMENT,
"name" varchar(6) DEFAULT NULL,
"score" decimal(5,2) DEFAULT NULL,
PRIMARY KEY ("id")
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
或者在手工編譯安裝時(shí)在MySQL主配置文件/etc/my.cnf的mysqld下添加:default-storage-engine=引擎名稱,之后重啟服務(wù)即可。
另外可以在創(chuàng)建表的時(shí)候就指定存儲(chǔ)類型:create table test (id int) engine=MyISAM;
? 本文介紹了MySQL數(shù)據(jù)庫的視圖以及簡(jiǎn)述了存儲(chǔ)過程,其中我們需要掌握MySQL數(shù)據(jù)庫系統(tǒng)的體系架構(gòu);其次我們介紹了MySQL的兩個(gè)存儲(chǔ)引擎MyISAM和InnoDB,并且介紹各自的特點(diǎn)以及相應(yīng)的使用場(chǎng)景;最后實(shí)例演示了如何配置存儲(chǔ)引擎的過程。