Java数据库篇8——索引、视图、存储过程、触发器
Java數據庫篇8——索引、視圖、存儲過程、觸發器
1、索引
1.1、索引是什么
在數據庫表中,對字段建立索引可以大大提高查詢速度。通過善用這些索引,可以令MySQL的查詢和 運行更加高效
如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是 一個人力三輪車。拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目 錄(索引)快速查找到需要的字
1.2、索引分類
| 主鍵索引 (primary key) | 主鍵是一種唯一性索引,每個表只能有一個主鍵, 用于標識數據表中的每一 條記錄 |
| 唯一索引 (unique) | 唯一索引指的是 索引列的所有值都只能出現一次, 必須唯一 |
| 普通索引 (index) | 最常見的索引,作用就是 加快對數據的訪問速度 |
1.3、主鍵索引
特點: 主鍵是一種唯一性索引,每個表只能有一個主鍵,用于標識數據表中的某一條記錄
一個表可以沒有主鍵,但最多只能有一個主鍵,并且主鍵值不能包含NULL
#建表時創建索引 CREATE TABLE 表名(-- 添加主鍵 (主鍵是唯一性索引,不能為null,不能重復,)字段名 類型 PRIMARY KEY, ); #建表后添加索引 ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )1.4、唯一索引
特點: 索引列的所有值都只能出現一次, 必須唯一
唯一索引可以保證數據記錄的唯一性。事實上,在許多場合,人們創建唯一索引的目的往往不是為了 提高訪問速度,而只是為了避免數據出現重復
#建表時創建索引 CREATE TABLE 表名(列名 類型(長度),-- 添加唯一索引UNIQUE [索引名稱] (列名) ); #建表后添加索引 create unique index 索引名 on 表名(列名(長度)) ALTER TABLE 表名 ADD UNIQUE ( 列名 )1.5、普通索引
#建表后添加索引 create index 索引名 on 表名(列名[長度]) ALTER TABLE 表名 ADD INDEX 索引名 (列名)1.6、刪除索引
ALTER TABLE table_name DROP INDEX index_name;1.7、索引的優缺點
添加索引首先應考慮在 where 及 order by 涉及的列上建立索引
索引的優點
- 大大的提高查詢速度
- 可以顯著的減少查詢中分組和排序的時間
索引的缺點
- 創建索引和維護索引需要時間,而且數據量越大時間越長
- 當對表中的數據進行增加,修改,刪除的時候,索引也要同時進行維護,降低了數據的維護速度
2、視圖
- 視圖是一種虛擬表
- 視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱為基表
- 向視圖提供數據內容的語句為 SELECT 語句, 可以將視圖理解為存儲起來的 SELECT 語句
- 視圖向用戶提供基表數據的另一種表現形式
- 就當成一個表用就可以
- 相當于一個只讀的表
2.1、視圖的作用
權限控制:比如,某幾個列可以運行用戶查詢,其他列不允許,可以開通視圖 查詢特定的列, 起到權限控制的作用
簡化復雜的多表查詢:視圖本身就是一條查詢SQL,我們可以將一次復雜的查詢 構建成一張視圖, 用戶只要查詢視圖 就可以獲取想要得到的信息(不需要再編寫復雜的SQL) 視圖主要就是為了簡化多表的查詢
2.2、視圖的創建
create view 視圖名 [column_list] as select語句; #view: 表示視圖 #column_list: 可選參數,表示屬性清單,指定視圖中各個屬性的名稱,默認情況下,與SELECT語句中查詢的屬性相同 #as : 表示視圖要執行的操作 #select語句: 向視圖提供數據內容2.3、視圖的使用
就當成一個只讀表用就可以
3、存儲過程
存儲過程(Stored Procedure)是一種在數據庫中存儲復雜程序,以便外部程序調用的一種數據 庫對象。存儲過程是為了完成特定功能的SQL語句集,經編譯創建并保存在數據庫中,用戶可通過 指定存儲過程的名字并給定參數(需要時)來調用執行
優點
- 存儲過程一旦調試完成后,就可以穩定運行,(前提是,業務需求要相對穩定,沒有變化)
- 存儲過程減少業務系統與數據庫的交互,降低耦合,數據庫交互更加快捷(應用服務器,與 數據庫服務器不在同一個地區)
缺點
- 在互聯網行業中,大量使用MySQL,MySQL的存儲過程與Oracle的相比較弱,所以較少使用,并且互聯網行業需求變化較快也是原因之一
- 盡量在簡單的邏輯中使用,存儲過程移植十分困難,數據庫集群環境,保證各個庫之間存儲 過程變更一致也十分困難
- 阿里的代碼規范里也提出了禁止使用存儲過程,存儲過程維護起來的確麻煩
3.1、存儲過程格式
DELIMITER $$ -- 聲明語句結束符,可以自定義 一般使用$$ CREATE PROCEDURE 過程名稱() -- 聲明存儲過程 BEGIN -- 開始編寫存儲過程 -- 要執行的操作 END $$ -- 存儲過程結束 DELIMITER $$ CREATE PROCEDURE goods_proc02(IN goods_id INT) BEGIN DELETE FROM goods WHERE gid = goods_id ; END $$ DELIMITER $$ CREATE PROCEDURE orders_proc(IN o_oid INT , IN o_gid INT ,IN o_price INT, OUT out_num INT) BEGIN -- 執行插入操作 INSERT INTO orders VALUES(o_oid,o_gid,o_price); -- 設置 num的值為 1 SET @out_num = 1; -- 返回 out_num的值 SELECT @out_num; END $$4、觸發器
觸發器(trigger)是MySQL提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事 件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,比如當對 一個表進行操作(insert,delete, update)時就會激活它執行
4.1、觸發器格式
delimiter $ -- 將Mysql的結束符號從 ; 改為 $,避免執行出現錯誤 CREATE TRIGGER Trigger_Name -- 觸發器名,在一個數據庫中觸發器名是唯一的 before/after(insert/update/delete) -- 觸發的時機 和 監視的事件 on table_Name -- 觸發器所在的表 for each row -- 固定寫法 叫做行觸發器, 每一行受影響,觸發事件都執行 begin -- begin和end之間寫觸發事件 end $ -- 結束標記總結
以上是生活随笔為你收集整理的Java数据库篇8——索引、视图、存储过程、触发器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Numpy 排序 -- sort()、a
- 下一篇: SpringBoot设置首页(默认页)跳