MySQL索引與視圖詳解
在MySQL中,索引類似于書籍的目錄,如果想要快速訪問數(shù)據(jù)表中的特定信息,可以建立索引加快數(shù)據(jù)查詢效率。
使用數(shù)據(jù)庫時,不僅需要提高對數(shù)據(jù)的查詢效率,也需要考慮數(shù)據(jù)的安全問題。在MySQL中可以創(chuàng)建一種叫作視圖的虛擬表,讓使用視圖的用戶只能訪問被允許訪問的結果集,從而提高數(shù)據(jù)的安全性。除了安全性,視圖還具備簡化查詢語句和邏輯數(shù)據(jù)獨立性等優(yōu)點。
在數(shù)據(jù)庫查詢數(shù)據(jù)時,默認是對全表的數(shù)據(jù)進行掃描,在項目開發(fā)中,MySQL的一張表可能就有千萬條數(shù)據(jù),多張表組合甚至有上億條數(shù)據(jù)。這樣查詢一條數(shù)據(jù)的效率實在是太低了,因此我們引入了索引,索引是數(shù)據(jù)庫中為提高數(shù)據(jù)查詢效率而常用的數(shù)據(jù)庫對象,它好比新華字典的音序表,通過音序表可以快速地查找內容。索引在數(shù)據(jù)表中一列或多列的值與記錄行之間按照一定的順序建立關系,以提高對數(shù)據(jù)表中數(shù)據(jù)的查詢速度。
索引按照實現(xiàn)語法的不同大致分為五種(可以放一起寫,這里每個字段分開展示)
1、主鍵索引
主鍵索引是一種特殊的唯一性索引,用于根據(jù)主鍵自身的唯一性標識每一條記錄。主鍵索引的字段不允許有NULL值。
CREATE TABLE dept_index( id INT PRIMARY KEY (INT) );

2、唯一性索引
創(chuàng)建唯一性索引的字段允許有NULL值,但需要保證索引對應字段中的值是唯一的。
CREATE TABLE dept_index( deptno INT UNIQUE INDEX (deptno)-- INDEX和KEY可以互相替換 );

3、普通索引
普通索引是MySQL中的基本索引類型,使用KEY或INDEX定義,不需要添加任何限制條件
CREATE TABLE dept_index( dname VARCHAR(50) INDEX (dname));

4、全文索引
全文索引主要用于提高在數(shù)據(jù)量較大的字段中的查詢效率。全文索引和SQL中給的LIKE模糊查詢類似,不同的是LIKE模糊查詢適用于在內容較少的文本中進行模糊匹配,全文檢索更擅長在大量的文本中進行數(shù)據(jù)檢索。全文索引只能創(chuàng)建在CHAR、VARCHAR或TEXT類型的字段上。
CREATE TABLE dept_index( introduction VARCHAR(200) FULLTEXT (introduction));

5、空間索引
空間索引只能創(chuàng)建在空間數(shù)據(jù)類型的字段上??臻g數(shù)據(jù)類型存儲的空間數(shù)據(jù)是指含有位置、大小、形狀以及自身分布特征等多方面信息的數(shù)據(jù)。MySQL中的空間數(shù)據(jù)類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。
對于創(chuàng)建空間索引的字段,必須將其聲明為NOT NULL
CREATE TABLE dept_index( address GEOMETRY NOT NULL SRID 4326 SPATIAL INDEX (address) );

上述都屬于單列索引,還存在復合索引如下
CREATE TABLE index_multi( id INT NOT NULL, NAME VARCHAR(20) NOT NULL, score FLOAT, INDEX multi(id,NAME) );

可以在創(chuàng)建表之后建立索引
CREATE UNIQUE INDEX unique_id ON dept_index02(id);

也可以通過修改表的形式添加索引
ALTER TABLE dept_index03 ADD UNIQUE INDEX index_id(id);-- index_id是起的索引名

查看添加的索引
SHOW INDEX FROM dept_index;

刪除索引(兩種方式任選)
1、ALTER TABLE dept_index DROP INDEX introduction;-- 想多刪就在introduction索引后面加
2、DROP INDEX dname ON dept_index;-- 刪除數(shù)據(jù)表dept_index中名稱為dname的索引
注意:雖然索引可以提高數(shù)據(jù)的查詢效率,但它會占用一定的磁盤空間,并且在創(chuàng)建和維護索引時,其消耗的時間是隨著數(shù)據(jù)量的增加而增加的。因此,使用索引時,應該綜合考慮其優(yōu)點和缺點
視圖的作用及意義
在實際開發(fā)中,有時候為了保障數(shù)據(jù)的安全性和提高查詢效率,希望創(chuàng)建一個只包含指定字段數(shù)據(jù)的虛擬表給用戶使用,此時可以使用視圖。視圖在數(shù)據(jù)庫中的作用類似于窗戶,用戶通過這個窗戶只能看到指定的數(shù)據(jù)。視圖本身不存儲數(shù)據(jù),它只是一個保存下來的 SELECT 語句,每次查詢視圖時,數(shù)據(jù)庫會執(zhí)行這個 SELECT 語句,從底層表中取出數(shù)據(jù)。
特點有下面三個
簡化查詢語句:比如日常開發(fā)需要經常使用一個比較復雜的語句進行查詢,此時就可以將該查詢語句定義為視圖,從而避免大量重復且復雜的操作
安全性:可以從數(shù)據(jù)庫指定字段給別人看,防止敏感信息泄露。還可以改視圖列名,隱藏底層列名
邏輯數(shù)據(jù)獨立性 :數(shù)據(jù)表增加字段不會影響基于該數(shù)據(jù)表查詢出數(shù)據(jù)的視圖(不改視圖本身,視圖就不會變)
1、基于單表創(chuàng)建視圖
CREATE VIEW view_emp AS SELECT empno,ename,job,deptno FROM emp;
2、查看視圖
SELECT * FROM view_emp;
指定視圖中字段的名稱,并創(chuàng)建
CREATE VIEW view_emp2(e_empno,e_ename,e_job,e_deptno) AS SELECT empno,ename,job,deptno FROM emp;
3、基于多表創(chuàng)建視圖
CREATE VIEW view_emp_dept AS SELECT e.empno,e.ename,e.job,e.deptno,d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno-- 紅色部分和之前左外連接一樣

4、查看視圖的狀態(tài)信息
SHOW TABLE STSTUS LIKE '視圖名';-- Comment 值為VIEW說明是視圖,為空則不是 SHOW TABLE STSTUS LIKE'view_emp';

SHOW TABLE STATUS LIKE 'dept';

5、查看視圖的創(chuàng)建語句
SHOW CREATE VIEW view_emp;

6、DESCRIBE:查看視圖結構,可縮寫成DESC
DESC `view_emp_dept`;

7、修改視圖
方法一 CREATE OR REPLACE VIEW 視圖名 AS SELECT語句; 創(chuàng)建一個新的視圖覆蓋舊的視圖
CREATE OR REPLACE VIEW -- 如果刪除OR REPLACE 就會報錯建過視圖了 view_emp_dept(e_empno,e_ename,e_job,e_deptno,e_mgr,d_dname) AS SELECT e.empno,e.ename,e.job,e.deptno,e.mgr,d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno
方法二 ALTER VIEW <視圖名> AS <SELECT 語句>;
ALTER VIEW view_emp_dept(e_empno,e_ename,e_job,e_deptno,e_mgr,e_sal,d_dname) AS SELECT e.empno,e.ename,e.job,e.deptno,e.mgr,e.sal,d.dname FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno-- 這塊select語句基本不動,改上面紅的視圖名
8、刪除視圖
DROP VIEW view_emp_dept;
9、修改數(shù)據(jù)
通過視圖修改數(shù)據(jù),最終修改的也是基本表中的數(shù)據(jù)
UPDATE view_dept SET v_dname='工程部' WHERE v_deptno=50;
10、 刪除數(shù)據(jù)
通過視圖刪除數(shù)據(jù),最終刪除的也是基本表中的數(shù)據(jù)
DELETE FROM view_dept WHERE v_deptno=6;
到此這篇關于MySQL索引與視圖的文章就介紹到這了,更多相關mysql索引與視圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL中between...and的使用對索引的影響說明
這篇文章主要介紹了MySQL中between...and的使用對索引的影響說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

