1. 程式人生 > 其它 >java之學習記錄 2 - 1 - 索引&檢視&儲存過程&DCL(資料控制語言 -- 許可權)

java之學習記錄 2 - 1 - 索引&檢視&儲存過程&DCL(資料控制語言 -- 許可權)

技術標籤:javamysql

一、mysql索引

1、什麼是索引

  • 在資料庫表中,對欄位建立索引可以大大提高查詢速度。通過善用這些索引,可以令MySQL的查詢和執行更加高效。
  • 如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查詢到需要的字

2、常見的索引分類

索引名稱說明
主鍵索引 (primary key) 主鍵是一種唯一性索引 , 每個表只能有一個主鍵 , 用於標識資料表中的每一條記錄
唯一索引 (unique)
唯一索引指的是 索引列的所有值都只能出現一次 , 必須唯一 .
普通索引 (index) 最常見的索引 , 作用就是 加快對資料的訪問速度

MySql將一個表的索引都儲存在同一個索引檔案中, 如果對中資料進行增刪改操作,MySql都會自動的更新索引.

3、主鍵索引(primary key)

  • 特點: 主鍵是一種唯一性索引,每個表只能有一個主鍵,用於標識資料表中的某一條記錄。
  • 一個表可以沒有主鍵,但最多隻能有一個主鍵,並且主鍵值不能包含NULL
語法格式:
-- 1、建立表的時候直接新增主鍵索引 (最常用)
CREATE TABLE 表名( 
    -- 新增主鍵 (主鍵是唯一性索引,不能為null,不能重複,) 
    欄位名 型別 PRIMARY KEY, 
);
-- 2、修改表結構 新增主鍵索引
ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )
4、唯一索引
  • 特點: 索引列的所有值都只能出現一次, 必須唯一.
  • 唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。
語法格式:
--1、 建立表的時候直接新增主鍵索引
CREATE TABLE 表名( 
    列名 型別(長度), 
    -- 新增唯一索引 
    UNIQUE [索引名稱] (列名) 
);
--2、 使用create語句建立: 在已有的表上建立索引
create unique index 索引名 on 表名(列名(長度))
--3、 修改表結構新增索引
ALTER TABLE 表名 ADD UNIQUE ( 列名 )

5、普通索引

  • 普通索引(由關鍵字KEYINDEX定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(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、儲存過程的優缺點:

  • 優點:
    • 儲存過程一旦除錯完成後,就可以穩定執行,(前提是,業務需求要相對穩定,沒有變化)
    • 儲存過程減少業務系統與資料庫的互動,降低耦合,資料庫互動更加快捷(應用伺服器,與資料庫伺服器不在同一個地區)
  • 缺點:
    • 在網際網路行業中,大量使用MySQLMySQL的儲存過程與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提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比如當對一個表進行操作(insertdelete 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 語言來定義一些許可權較小的使用者 , 分配不同的許可權來管理和維護資料庫。
1、建立使用者
語法格式:
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