java之學習記錄 2 - 1 - 索引&檢視&儲存過程&DCL(資料控制語言 -- 許可權)
阿新 • • 發佈:2020-12-14
一、mysql索引
1、什麼是索引
- 在資料庫表中,對欄位建立索引可以大大提高查詢速度。通過善用這些索引,可以令MySQL的查詢和執行更加高效。
- 如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查詢到需要的字
2、常見的索引分類
索引名稱 | 說明 |
主鍵索引 (primary key) | 主鍵是一種唯一性索引 , 每個表只能有一個主鍵 , 用於標識資料表中的每一條記錄 |
唯一索引
(unique) | 唯一索引指的是 索引列的所有值都只能出現一次 , 必須唯一 . |
普通索引 (index) | 最常見的索引 , 作用就是 加快對資料的訪問速度 |
MySql將一個表的索引都儲存在同一個索引檔案中, 如果對中資料進行增刪改操作,MySql都會自動的更新索引.
3、主鍵索引(primary key)
- 特點: 主鍵是一種唯一性索引,每個表只能有一個主鍵,用於標識資料表中的某一條記錄。
- 一個表可以沒有主鍵,但最多隻能有一個主鍵,並且主鍵值不能包含NULL。
4、唯一索引語法格式: -- 1、建立表的時候直接新增主鍵索引 (最常用) CREATE TABLE 表名( -- 新增主鍵 (主鍵是唯一性索引,不能為null,不能重複,) 欄位名 型別 PRIMARY KEY, ); -- 2、修改表結構 新增主鍵索引 ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )
- 特點: 索引列的所有值都只能出現一次, 必須唯一.
- 唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。
語法格式: --1、 建立表的時候直接新增主鍵索引 CREATE TABLE 表名( 列名 型別(長度), -- 新增唯一索引 UNIQUE [索引名稱] (列名) ); --2、 使用create語句建立: 在已有的表上建立索引 create unique index 索引名 on 表名(列名(長度)) --3、 修改表結構新增索引 ALTER TABLE 表名 ADD UNIQUE ( 列名 )
5、普通索引
- 普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHERE column=)或排序條件(ORDERBY column)中的資料列建立索引。
語法格式:
-- 1、使用create index 語句建立: 在已有的表上建立索引
create index 索引名 on 表名(列名[長度])
-- 2、修改表結構新增索引
ALTER TABLE 表名 ADD INDEX 索引名 (列名)
6、刪除索引
- 由於索引會佔用一定的磁碟空間,因此,為了避免影響資料庫的效能,應該及時刪除不再使用的索引
語法格式:
ALTER TABLE 表名 DROP INDEX 索引列名;
-- 例如:刪除 demo01 表中名為 dname_indx 的普通索引。
ALTER TABLE demo01 DROP INDEX dname_indx;
7、索引效能測試:
匯入一個含有500w條資料的資料庫(test_index)並測試
未新增索引,進行分組查詢
SELECT * FROM test_index GROUP BY dname;
耗時:
為表中查詢條件欄位新增索引 dname 並再次執行查詢
ALTER TABLE test_index ADD INDEX dname_indx(dname);
-- 執行查詢
SELECT * FROM test_index GROUP BY dname;
耗時:
8、索引的優缺點總結:
- 新增索引首先應考慮在 where 及 order by 涉及的列上建立索引。
- 索引的優點
- 1. 大大的提高查詢速度
- 2. 可以顯著的減少查詢中分組和排序的時間。
- 索引的缺點
- 1. 建立索引和維護索引需要時間,而且資料量越大時間越長
- 2. 當對錶中的資料進行增加,修改,刪除的時候,索引也要同時進行維護,降低了資料的維護速度
二:mysql檢視
1、什麼是檢視:
- 檢視是一種虛擬表。
- 檢視建立在已有表的基礎上, 檢視賴以建立的這些表稱為基表。
- 向檢視提供資料內容的語句為 SELECT 語句, 可以將檢視理解為儲存起來的 SELECT 語句.
- 檢視向用戶提供基表資料的另一種表現形式
2、檢視的作用:
- 許可權控制時可以使用
- 比如,某幾個列可以執行使用者查詢,其他列不允許,可以開通檢視 查詢特定的列, 起到許可權控制的作用
- 簡化複雜的多表查詢
- 檢視 本身就是一條查詢SQL,我們可以將一次複雜的查詢 構建成一張檢視, 使用者只要查詢檢視就可以獲取想要得到的資訊(不需要再編寫複雜的SQL)
- 檢視主要就是為了簡化多表的查詢
3、檢視的使用:
- 建立檢視:
語法格式:
create view 檢視名 [column_list] as select語句;
view: 表示檢視
column_list: 可選引數,表示屬性清單,指定檢視中各個屬性的名稱,預設情況下,與SELECT語句中查詢的屬性相同
as : 表示檢視要執行的操作
select語句: 向檢視提供資料內容
- 建立一張檢視
1. 先編寫查詢語句 查詢所有商品 和 商品的對應分類資訊
SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`;
2.基於上面的查詢語句,建立一張檢視
CREATE VIEW products_category_view AS SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`;
- 查詢檢視 , 當做一張只讀的表操作就可以
SELECT * FROM products_category_view;
4、檢視與表的區別
- 檢視是建立在表的基礎上,表儲存資料庫中的資料,而檢視只是做一個數據的展示
- 通過檢視不能改變表中資料(一般情況下檢視中的資料都是表中的列 經過計算得到的結果,不允許更新)
- 刪除檢視,表不受影響,而刪除表,檢視不再起作用
三:mysql儲存過程
1、什麼是儲存過程:
- MySQL 5.0 版本開始支援儲存過程。
- 儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。
- 簡單理解: 儲存過程其實就是一堆 SQL 語句的合併。中間加入了一些邏輯控制。
2、儲存過程的優缺點:
- 優點:
- 儲存過程一旦除錯完成後,就可以穩定執行,(前提是,業務需求要相對穩定,沒有變化)
- 儲存過程減少業務系統與資料庫的互動,降低耦合,資料庫互動更加快捷(應用伺服器,與資料庫伺服器不在同一個地區)
- 缺點:
- 在網際網路行業中,大量使用MySQL,MySQL的儲存過程與Oracle的相比較弱,所以較少使用,並且網際網路行業需求變化較快也是原因之一
- 儘量在簡單的邏輯中使用,儲存過程移植十分困難,資料庫叢集環境,保證各個庫之間儲存過程變更一致也十分困難。
- 阿里的程式碼規範裡也提出了禁止使用儲存過程,儲存過程維護起來的確麻煩;
3、儲存過程的建立:
方式一
- 準備資料
商品表
CREATE TABLE goods(
gid INT,
NAME VARCHAR(20),
num INT -- 庫存
);
訂單表 CREATE TABLE orders(
oid INT,
gid INT,
price INT -- 訂單價格
);
向商品表中新增3條資料
INSERT INTO goods VALUES(1,'奶茶',20);
INSERT INTO goods VALUES(2,'綠茶',100);
INSERT INTO goods VALUES(3,'花茶',25);
- 建立簡單的儲存過程及呼叫
語法格式:
DELIMITER $$ -- 宣告語句結束符,可以自定義 一般使用$$
CREATE PROCEDURE 過程名稱() -- 宣告儲存過程
BEGIN -- 開始編寫儲存過程
-- 要執行的操作
END $$ -- 儲存過程結束
根據上面準備的表,編寫儲存過程,查詢所有的商品資料
DELIMITER $$
CREATE PROCEDURE goods_proc()
BEGIN
select * from goods;
END $$
----------------------------------------------------------
呼叫儲存過程
語法格式:
call 儲存過程名
呼叫儲存過程 查詢goods表所有資料
call goods_proc;
方式二:
- IN 輸入引數:表示呼叫者向儲存過程傳入值
CREATE PROCEDURE 儲存過程名稱(IN 引數名 引數型別)
- 建立接收引數的儲存過程
例:接收一個商品id, 根據id刪除資料
DELIMITER $$
CREATE PROCEDURE goods_proc02(IN goods_id INT)
BEGIN
DELETE FROM goods WHERE gid = goods_id ;
END $$
----------------------
呼叫儲存過程 傳遞引數:
刪除 id為2的商品
CALL goods_proc02(2);
方式三:
- 變數賦值
SET @變數名=值
- OUT 輸出引數:表示儲存過程向呼叫者傳出值
OUT 變數名 資料型別
- 建立儲存過程
例如:向訂單表 插入一條資料, 返回1,表示插入成功
-- 建立儲存過程 接收引數插入資料, 並返回受影響的行數
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 $$
--------------------------------------
呼叫儲存過程:
CALL orders_proc(1,2,30,@out_num);
四:mysql觸發器:
1、什麼是觸發器:
- 觸發器(trigger)是MySQL提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作(insert,delete, update)時就會啟用它執行。
- 簡單理解: 當我們執行一條sql語句的時候,這條sql語句的執行會自動去觸發執行其他的sql語句。
2、觸發器建立的四個要素
- 監視地點(table)
- 監視事件(insert/update/delete)
- 觸發時間(before/after)
- 觸發事件(insert/update/delete)
3、建立觸發器:
語法格式:
delimiter $ -- 將Mysql的結束符號從 ; 改為 $,避免執行出現錯誤
CREATE TRIGGER Trigger_Name -- 觸發器名,在一個數據庫中觸發器名是唯一的 before/after(insert/update/delete) -- 觸發的時機 和 監視的事件
on table_Name -- 觸發器所在的表
for each row -- 固定寫法 叫做行觸發器, 每一行受影響,觸發事件都執行
begin -- begin和end之間寫觸發事件
end $ -- 結束標記
-----------------------------------
例如:在下訂單的時候,對應的商品的庫存量要相應的減少,賣出商品之後減少庫存量。編寫觸發器
-- 1.修改結束標識
DELIMITER $
-- 2.建立觸發器
CREATE TRIGGER t1
-- 3.指定觸發的時機,和要監聽的表
AFTER INSERT ON orders
-- 4.行觸發器 固定寫法
FOR EACH ROW
-- 4.觸發後具體要執行的事件
BEGIN
-- 訂單+1 庫存-1
UPDATE goods SET num = num -1 WHERE gid = 1;
END$
- 查詢商品表(goods)中的資料
- 向訂單表中新增一條資料
INSERT INTO orders VALUES(1,1,25);
- goods表中的資料隨之 -1
五:DCL(資料控制語言)
- MySql 預設使用的都是 root 使用者,超級管理員,擁有全部的許可權。除了 root 使用者以外,我們還可以通過DCL 語言來定義一些許可權較小的使用者 , 分配不同的許可權來管理和維護資料庫。
語法格式:
CREATE USER '使用者名稱'@'主機名' IDENTIFIED BY '密碼';
引數 | 說明 |
使用者名稱 | 建立新使用者 |
主機名 | 指定該使用者在哪個主機上可以登陸,本地使用者可用 localhost 如果想讓該使用者可以 從任意遠端主機登陸,可以使用萬用字元 % |
密碼 | 登入密碼 |
建立 admin1 使用者,只能在 localhost 這個伺服器登入 mysql 伺服器,密碼為 123456
CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456';
- 建立的使用者在名字為 mysql 的 資料庫中的 user 表中
建立 admin2 使用者可以在任何電腦上登入 mysql 伺服器,密碼為 123456
CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';
- % 表示 使用者可以在任意電腦登入 mysql伺服器.
2、使用者授權:
建立好的使用者 , 需要進行授權語法格式:
GRANT 許可權 1, 許可權 2... ON 資料庫名.表名 TO '使用者名稱'@'主機名';
引數 | 說明 |
許可權 | 授予使用者的許可權,如 CREATE 、 ALTER 、 SELECT 、 INSERT 、 UPDATE 等。 如果要授予所有的許可權則使用 ALL |
ON | 用來指定許可權針對哪些庫和表。 |
TO | 表示將許可權賦予某個使用者。 |
給 admin1 使用者分配對 db4 資料庫中 products 表的 操作許可權:查詢
GRANT SELECT ON db4.products TO 'admin1'@'localhost';
給 admin2 使用者分配所有許可權,對所有資料庫的所有表
GRANT ALL ON *.* TO 'admin2'@'%';
- 使用admin1登陸資料庫 測試許可權
- 發現數據庫列表中只有db4,表只有products
- 執行操作
執行查詢操作 可以查詢
SELECT * FROM products;
執行插入操作,發現不允許執行,沒有許可權
INSERT INTO products VALUES('p010','小鳥伏特加',1000,1,NULL);
3、檢視許可權:
語法格式:
SHOW GRANTS FOR '使用者名稱'@'主機名';
檢視root使用者許可權
SHOW GRANTS FOR 'root'@'localhost';
- GRANT ALL PRIVILEGES 是表示所有許可權
4、刪除使用者:
語法格式:
DROP USER '使用者名稱'@'主機名';
刪除admin1使用者
DROP USER 'admin1'@'localhost';
5、查詢使用者
- 選擇名為 mysql的資料庫, 直接查詢 user表即可
SELECT * FROM USER;
其他知識點:
- 命令列備份
語法格式:
mysqldump -u 使用者名稱 -p 密碼 資料庫 > 檔案路徑
例如:備份db2中的資料 到 H盤的 db2.sql 檔案中
mysqldump -uroot -p123456 db2 > H:/db2.sql
注:執行該命令是須進入mysql的安裝目錄的bin目錄下執行
--------------------------
匯入資料庫
source sql檔案地址
注:匯入前須先建立好資料庫或選擇資料庫 use