MySql之視圖索引的具體使用
一.視圖
1.1 什么是視圖
MySQL的視圖是邏輯上對數(shù)據(jù)庫表的虛擬表,它是由一個(gè)查詢語句生成的結(jié)果集,可以像表一樣使用。視圖并不在數(shù)據(jù)庫中實(shí)際存儲數(shù)據(jù),而是在查詢時(shí)動態(tài)生成結(jié)果。視圖的數(shù)據(jù)是依賴于真實(shí)表中的數(shù)據(jù),一旦真實(shí)的表中數(shù)據(jù)發(fā)送變化,視圖的數(shù)據(jù)也會跟著一起變化
1.2 視圖與數(shù)據(jù)表的區(qū)別
- 存儲方式:數(shù)據(jù)表是實(shí)際存儲數(shù)據(jù)的物理結(jié)構(gòu),它在數(shù)據(jù)庫中占據(jù)存儲空間,并且可以持久保存數(shù)據(jù)。而視圖只是一個(gè)邏輯上的概念,它不存儲數(shù)據(jù),僅僅是對一個(gè)或多個(gè)表的查詢結(jié)果進(jìn)行了封裝和抽象。
- 數(shù)據(jù)內(nèi)容:數(shù)據(jù)表存儲了實(shí)際的數(shù)據(jù)記錄,可以對其進(jìn)行增刪改查操作。視圖是一個(gè)基于一個(gè)或多個(gè)數(shù)據(jù)表的查詢結(jié)果集,它本身不存儲數(shù)據(jù)。
- 結(jié)構(gòu)定義:數(shù)據(jù)表有自己的列名和數(shù)據(jù)類型定義,具有固定的數(shù)據(jù)結(jié)構(gòu)。而視圖的結(jié)構(gòu)是基于查詢語句中選擇的列和其它條件定義的,它可以根據(jù)需要?jiǎng)討B(tài)變化。
- 數(shù)據(jù)安全性:通過視圖可以實(shí)現(xiàn)對表數(shù)據(jù)的訪問控制,只向用戶暴露部分?jǐn)?shù)據(jù),并且可以隱藏表的結(jié)構(gòu)細(xì)節(jié)。這種數(shù)據(jù)訪問控制是基于表級別的,而不是基于視圖級別的。
總的來說,數(shù)據(jù)表是實(shí)際存儲數(shù)據(jù)的物理結(jié)構(gòu),而視圖是對數(shù)據(jù)表進(jìn)行查詢操作的邏輯封裝,提供了一種抽象和靈活的數(shù)據(jù)訪問方式。視圖可以簡化復(fù)雜的查詢操作,提高數(shù)據(jù)的安全性和可維護(hù)性。
1.3 視圖的優(yōu)點(diǎn)
- 簡化數(shù)據(jù):視圖可以對多個(gè)表進(jìn)行聯(lián)合查詢或者進(jìn)行表之間的連接操作,從而簡化復(fù)雜的查詢操作。通過預(yù)定義好的視圖,可以避免在每次查詢時(shí)都需要編寫重復(fù)的復(fù)雜查詢語句,提高了查詢的效率和可維護(hù)性。
- 數(shù)據(jù)安全性:通過視圖,可以對數(shù)據(jù)庫表進(jìn)行一定程度的隱藏和保護(hù)。可以選擇性地向用戶公開表的部分?jǐn)?shù)據(jù),同時(shí)隱藏了敏感數(shù)據(jù)或者列,從而加強(qiáng)了對數(shù)據(jù)的安全性控制。通過視圖,可以實(shí)現(xiàn)對特定用戶或者用戶組的數(shù)據(jù)訪問權(quán)限的控制,提高了數(shù)據(jù)安全性。
- 簡化權(quán)限管理:視圖可以簡化權(quán)限管理的過程??梢詫⑻囟ǖ挠脩艋蛴脩艚M的權(quán)限限定在視圖上,而不是直接在表上設(shè)置權(quán)限。這樣,在權(quán)限管理時(shí)可以更細(xì)粒度地控制用戶對數(shù)據(jù)的訪問和操作。
- 共享所需數(shù)據(jù):通過使用視圖,每個(gè)用戶不必都定義和存儲自己所需的數(shù)據(jù),可以共享數(shù)據(jù)庫中的數(shù)據(jù),同樣的數(shù)據(jù)只需要存儲一次。
1.4 視圖語法
creat view v_視圖名 as select 語句
二.索引
2.1 什么是索引
索引是數(shù)據(jù)庫中用于提高數(shù)據(jù)查詢性能的一種數(shù)據(jù)結(jié)構(gòu)。它類似于書籍的目錄,通過在某個(gè)列或一組列上創(chuàng)建索引,數(shù)據(jù)庫可以快速定位到包含特定值的行,而無需掃描整個(gè)表。
索引的創(chuàng)建是基于特定的列或列組合,它們存儲了對應(yīng)的值和指向?qū)嶋H數(shù)據(jù)存儲位置的指針。當(dāng)執(zhí)行查詢語句時(shí),數(shù)據(jù)庫可以利用索引直接跳過大量的數(shù)據(jù)行,快速定位到目標(biāo)數(shù)據(jù),從而提高查詢效率。
2.2 為什么要使用索引
索引是 MySQL 中十分重要的數(shù)據(jù)庫對象,是數(shù)據(jù)庫性能調(diào)優(yōu)技術(shù)的基礎(chǔ),常用于實(shí)現(xiàn)數(shù)據(jù)的快速檢索。
提高數(shù)據(jù)的完整性和一致性:索引還可以用于強(qiáng)制實(shí)施數(shù)據(jù)完整性。通過創(chuàng)建唯一索引或主鍵索引,可以確保某個(gè)列的值在表中是唯一的,避免了重復(fù)數(shù)據(jù)的插入。
減少IO開銷:在沒有索引的情況下,數(shù)據(jù)庫系統(tǒng)需要遍歷整個(gè)數(shù)據(jù)表來找到所需的數(shù)據(jù)。而有了索引,數(shù)據(jù)庫可以直接跳過大部分?jǐn)?shù)據(jù),只訪問包含所需數(shù)據(jù)的數(shù)據(jù)頁,從而減少了IO開銷,提高了查詢效率。
2.3 索引的優(yōu)缺點(diǎn) ?
優(yōu)點(diǎn):
通過創(chuàng)建唯一索引可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
可以給所有的 MySQL 列類型設(shè)置索引。
可以大大加快數(shù)據(jù)的查詢速度,這是使用索引最主要的原因。
在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。
在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時(shí)也可以顯著減少查詢中分組和排序的時(shí)間
缺點(diǎn):
創(chuàng)建和維護(hù)索引組要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會增加。
索引需要占磁盤空間,除了數(shù)據(jù)表占數(shù)據(jù)空間以外,每一個(gè)索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。
當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
索引可以提高查詢速度,但是會影響插入記錄的速度。因?yàn)椋蛴兴饕谋碇胁迦胗涗洉r(shí),數(shù)據(jù)庫系統(tǒng)會按照索引進(jìn)行排序,這樣就降低了插入記錄的速度,插入大量記錄時(shí)的速度影響會更加明顯。這種情況下,最好的辦法是先刪除表中的索引,然后插入數(shù)據(jù),插入完成后,再創(chuàng)建索引。
2.4 何時(shí)不使用索引
表里面的數(shù)據(jù)太少
經(jīng)常增刪改的表
數(shù)據(jù)重復(fù)且分布均勻的表字段,只應(yīng)該為經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列建立索引(如果某個(gè)數(shù)據(jù)類包含太多的重復(fù)數(shù)據(jù),建立索引沒有太大意義)
where條件里用不到的字段不創(chuàng)建索引(因?yàn)椋黾铀饕龝黾哟疟P的內(nèi)存)
2.5 索引何時(shí)失效 ?
- like以通配符%開頭索引
- 當(dāng)全表掃描比走索引快的時(shí)候 ,比如,查詢主鍵的時(shí)候
- 字符串不加單引號索引會失效 當(dāng)然一般字符串都是要加單引號
- where中索引列使用了函數(shù)
- is null 可以索引。但是 is not null 無法使用索引 (取決于某一列具體情況)
- 復(fù)合索引沒有用到左列字段(最左前綴法則,如果沒用用到最左列索引,或中間跳過了某列有索引的列,索引會部分失效)
- 條件中有or,前面的列有索引,后面的列沒有,索引會失效。想讓索引生效,只能將or條件中的每個(gè)列都加上索引
2.6 索引的分類
MySQL索引分為普通索引、唯一索引、主鍵索引、組合索引、全文索引。索引不會包含有null值的列,索引項(xiàng)可以為null(唯一索引、組合索引等),但是只要列中有null值就不會被包含在索引中。
2.6.1 普通索引
創(chuàng)建: create index index_索引名 on 表名(列名)
刪除: drop index index_索引名 on 表名
2.6.2 唯一索引
唯一索引與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
創(chuàng)建:create unique indx index_索引名 on 表名(列名)
2.6.3 組合索引
組合索引指在多個(gè)字段上創(chuàng)建的索引,只有在查詢條件中使用了創(chuàng)建索引時(shí)的第一個(gè)字段,索引才會被使用。使用組合索引時(shí)遵循最左前綴集合。
到此這篇關(guān)于MySql之視圖索引的具體使用的文章就介紹到這了,更多相關(guān)MySql 視圖索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_Running: No的解決方法[已測
為了服務(wù)器更好的安全特將mysql服務(wù)器同步一下,show slave status\G出現(xiàn)了Slave_IO_Running: No 錯(cuò)誤,特整理了下,方便以后配置2011-06-06ERROR 1222 (21000): The used SELECT statements have a differ
mysql 提示SQL-ERROR summary different number of columns2011-07-07