前面的文章已經介紹了MySQL的索引與事務以及MySQL的備份與恢復的相關的內容,本文將對MySQL視圖及存儲過程以及存儲引擎進行講述。mysql
咱們在使用SQL語句進行多表查詢的時候的命令是很是冗長而麻煩的,若是說這樣的操做還很是多的使用的狀況下就會加大工做人員的工做量,畢竟不能保證如此長的代碼不會寫錯,而且屢次進行如此複雜的查詢也會形成服務器資源佔用比變大的問題,那麼咱們有什麼好的辦法解決這樣的問題呢?算法
其實,咱們能夠將這些須要常常查詢的數據內容(可能存在於多個表中)進行彙總到一個虛擬的表中,既方便了工做人員查詢,也減輕了服務器的負擔,而且在節約磁盤空間的同時也能夠支持數據的動態變化,而這樣的表就是「視圖」。sql
其實視圖是一種邏輯表,自己並不存放數據。而是做爲一個select語句保存咋數據字典(能夠理解爲一個容器)中。經過視圖,能夠展示基表的備份數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。shell
基表:用來建立視圖的表base table數據庫
視圖所佔資源較少,就比如是水中月,實際並不存在,可是會根據基表的變化而產生變化。緩存
優勢:安全
1)簡單:使用視圖的用戶徹底不須要關心後面對應的表的結構、關聯條件和篩選條件,對用戶來講已是過濾好的複合條件的結果集。服務器
2)安全:使用視圖的用戶只能訪問他們被容許查詢的結果集,對錶的權限管理並不能限制到某個行某個列,可是經過視圖就能夠簡單的實現。架構
3)數據獨立:一旦視圖的結構肯定了,能夠屏蔽表結構變化對用戶的影響,源表增長列對視圖沒有影響;源表修改列名,則能夠經過修改視圖來解決,不會形成對訪問者的影響。併發
總而言之,使用視圖的大部分狀況是爲了保障數據安全性,提升查詢效率。
缺點:
1)性能差:數據庫必須把視圖查詢轉化成對基本表的查詢,若是這個視圖是由一個複雜的多表查詢所定義,那麼,即便是視圖的一個簡單查詢,數據庫也要把它變成一個複雜的結合體,須要花費必定的時間。
2)修改限制:當用戶試圖修改視圖的某些信息時,數據庫必須把它轉化爲對基本表的某些信息的修改,對於簡單的視圖來講,這是很方便的,可是,對於比較複雜的試圖,多是不可修改的。
對於視圖的算法,簡單介紹一下,咱們須要在建立視圖的時候指定,基本語法:
create + [algorithm = temptable/merge/undefined] + view + 視圖名 + as + select語句 with check option;
視圖算法,即系統對視圖以及外部查詢視圖的select語句的一種解析方式。視圖算法有三種,分別爲:
建立通常視圖命令格式:
create view 視圖名稱 as select +內容
簡單的說,就是一組SQL語句集,功能強大,能夠實現一些比較複雜的邏輯功能,相似於JAVA語言中的方法;
備註:存儲過程跟觸發器有點相似,都是一組SQL集,可是存儲過程是主動調用的,且功能比觸發器更增強大,觸發器是某件事觸發後自動調用;
有輸入輸出參數,能夠聲明變量,有if/else, case,while等控制語句,經過編寫存儲過程,能夠實現複雜的邏輯功能;
函數的廣泛特性:模塊化,封裝,代碼複用;
速度快,只有首次執行需通過編譯和優化步驟,後續被調用能夠直接執行,省去以上步驟;
MySQL中的數據用各類不一樣的技術存儲在文件或者內存中。而這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平並最終提供普遍的不一樣的功能和能力。
這些不一樣的技術以及與之相應的相關功能在MySQL中被稱做爲「存儲引擎」。MySQL提供了多個不一樣的存儲引擎,能夠預先設置或者在MySQL服務器中啓用。
以上主要由6部分組成,主要有各類組件以及存儲引擎和文件系統。咱們作簡單的介紹
Connectors:鏈接組件,須要有驅動支持;主要用於使用不一樣的語言代碼程序和MySQL的交互
Connection Pool:鏈接池組件;主要是管理、緩衝用戶的鏈接,線程處理等須要緩存的需求
Management Service & Utilities:管理服務與工具組件;例如進行備份恢復、MySQL複製、集羣等;
SQL Interface:SQL接口;主要接受用戶的SQL命令語句,而且返回用戶須要查詢的結果;
Parser:查詢解析器;當SQL命令語句傳遞到解析器的時候會被解析器驗證和解析(權限、語法結構);
Optimizer:查詢優化器;SQL語句在執行以前使用查詢優化器對查詢進行優化;舉個例子:
select id,name from where hobby = ‘read’;
1)這個select語句查詢會先根據where語句進行選取;
2)其次根據id和name進行屬性投影;
3)結合兩個查詢條件輸出最終的查詢結果
Caches & Buffers:緩存;當查詢緩存中有命中的查詢結果,查詢語句就能夠直接去查詢緩存中取數據;
Plugggable Storage Engines:插入式存儲引擎;是爲了管理操做數據(存儲、更新、查詢數據的方法方式)
MyISAM存儲引擎是MySQL數據庫系統5.5版本以前的默認存儲引擎。考慮到的問題是:查詢的次數遠遠大於更新的次數,所以須要執行讀取操做數據速度比較快,而且不須要佔用大量的內存和存儲資源。
MyISAM管理非事務表,提供索引和字段管理,且擁有表格鎖定機制從而優化多個併發的讀寫操做。
不支持事務;
表格鎖定機制,數據在更新時鎖定整個表;
數據庫在讀寫過程當中互相阻塞;
能夠經過key_buffer_size來設置緩存索引,提升訪問性能,減小磁盤IO讀寫壓力
速度快且佔用資源少;
不支持外鍵約束,只支持全文索引;
存儲文件爲
1).frm 文件存儲表定義;
2).MYD 數據文件擴展名
3).MYI 索引文件擴展名
InnoDB存儲引擎是MySQL數據庫系統535版本以後的默認存儲引擎,是爲了解決或者優化MyISAM存儲引擎不足之處而產生的。
能夠這麼說,InnoDB存儲引擎是爲處理巨大數據量時的最大性能而設計的。
根據需求選擇適合的存儲引擎,而後考慮如何修改;
(1)查看數據庫能夠配置的存儲引擎類型;
(2)查看錶正在使用的存儲引擎類型;
(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)
Engine列表示當前版本的MySQL所支持的引擎類型;
Support列表示對應引擎是否可使用,DEFAULT表示默認使用的類型此版本(MySQL5.7.17)是InnoDB;
Transactions列表示對應引擎是否支持事務;
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命令也能夠查看錶的存儲引擎
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)
或者在手工編譯安裝時在MySQL主配置文件/etc/my.cnf的mysqld下添加:default-storage-engine=引擎名稱,以後重啓服務便可。
另外能夠在建立表的時候就指定存儲類型:create table test (id int) engine=MyISAM;
本文介紹了MySQL數據庫的視圖以及簡述了存儲過程,其中咱們須要掌握MySQL數據庫系統的體系架構;其次咱們介紹了MySQL的兩個存儲引擎MyISAM和InnoDB,而且介紹各自的特色以及相應的使用場景;最後實例演示瞭如何配置存儲引擎的過程。