MySQL學習06(事務和索引)

事務

概述

什麼是事務

  • 事務就是將一組SQL語句放在同一批次內去執行
  • 若是一個SQL語句出錯,則該批次內的全部SQL都將被取消執行
  • MySQL事務處理只支持InnoDB和BDB數據表類型

事務的ACID原則

原子性(Atomic)
整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(ROLLBACK)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
一致性(Consist)
一個事務能夠封裝狀態改變(除非它是一個只讀的)。事務必須始終保持系統處於一致的狀態,無論在任何給定的時間併發事務有多少。也就是說:若是事務是併發多個,系統也必須如同串行事務同樣操做。其主要特徵是保護性和不變性(Preserving an Invariant),以轉帳案例爲例,假設有五個帳戶,每一個帳戶餘額是100元,那麼五個帳戶總額是500元,若是在這個5個帳戶之間同時發生多個轉帳,不管併發多少個,好比在A與B帳戶之間轉帳5元,在C與D帳戶之間轉帳10元,在B與E之間轉帳15元,五個帳戶總額也應該仍是500元,這就是保護性和不變性。
隔離性(Isolated)
隔離狀態執行事務,使它們好像是系統在給定時間內執行的惟一操做。若是有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認爲只有該事務在使用系統。這種屬性有時稱爲串行化,爲了防止事務操做間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。
持久性(Durable)
在事務完成之後,該事務對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。mysql

事務實現

基本語法sql

-- 使用set語句來改變自動提交模式
SET autocommit = 0;  /*關閉*/
SET autocommit = 1;  /*開啓*/

-- 注意:
-- 1.MySQL中默認是自動提交
-- 2.使用事務時應先關閉自動提交

-- 開始一個事務,標記事務的起始點
START TRANSACTION 

-- 提交一個事務給數據庫
COMMIT

-- 將事務回滾,數據回到本次事務的初始狀態
ROLLBACK

-- 還原MySQL數據庫的自動提交
SET autocommit =1;

-- 保存點
SAVEPOINT 保存點名稱 -- 設置一個事務保存點
ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點
RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點


索引

索引分類

索引的做用

  • 提升查詢速度
  • 確保數據的惟一性
  • 能夠加速表和表之間的鏈接 , 實現表與表之間的參照完整性
  • 使用分組和排序子句進行數據檢索時 , 能夠顯著減小分組和排序的時間
  • 全文檢索字段進行搜索優化.

分類

  • 主鍵索引 (Primary Key)
  • 惟一索引 (Unique)
  • 常規索引 (Index)
  • 全文索引 (FullText)

主鍵索引

主鍵 : 某一個屬性組能惟一標識一條記錄數據庫

特色 :服務器

  • 最多見的索引類型
  • 確保數據記錄的惟一性
  • 肯定特定數據記錄在數據庫中的位置

惟一索引

做用 : 避免同一個表中某數據列中的值重複數據結構

與主鍵索引的區別併發

  • 主鍵索引只能有一個
  • 惟一索引可能有多個
CREATE TABLE `Grade`(
 `GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,
 `GradeName` VARCHAR(32) NOT NULL UNIQUE
  -- 或 UNIQUE KEY `GradeID` (`GradeID`)
)

常規索引

做用 : 快速定位特定數據函數

注意 :工具

  • index 和 key 關鍵字均可以設置常規索引
  • 應加在查詢找條件的字段
  • 不宜添加太多常規索引,影響數據的插入,刪除和修改操做
CREATE TABLE `result`(
  -- 省略一些代碼
 INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 建立表時添加
)

-- 建立後添加
ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);

全文索引

做用 : 快速定位特定數據性能

注意 :測試

  • 只能用於MyISAM類型的數據表
  • 只能用於CHAR , VARCHAR , TEXT數據列類型
  • 適合大型數據集
-- 方法一:建立表時
CREATE TABLE 表名 (
    字段名1 數據類型 [完整性約束條件…],
    字段名2 數據類型 [完整性約束條件…],
    [UNIQUE | FULLTEXT | SPATIAL ]  INDEX | KEY
    [索引名] (字段名[(長度)] [ASC |DESC])
);
-- 方法二:CREATE在已存在的表上建立索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(長度)] [ASC |DESC]) ;
-- 方法三:ALTER TABLE在已存在的表上建立索引
 ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名[(長度)] [ASC |DESC]) ;

刪除索引:DROP INDEX 索引名 ON 表名字;

刪除主鍵索引: ALTER TABLE 表名 DROP PRIMARY KEY;

顯示索引信息: SHOW INDEX FROM student;

/*增長全文索引*/
ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`);

/*EXPLAIN : 分析SQL語句執行性能*/
EXPLAIN SELECT * FROM student WHERE studentno='1000';

/*使用全文索引*/
-- 全文搜索經過 MATCH() 函數完成。
-- 搜索字符串作爲 against() 的參數被給定。搜索以忽略字母大小寫的方式執行。對於表中的每一個
記錄行,MATCH() 返回一個相關性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文
本之間的類似性尺度。
EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');

注意:MySQL 5.6 之前的版本,只有 MyISAM 存儲引擎支持全文索引;MySQL 5.6 及之後的版本,MyISAM 和 InnoDB 存儲引擎均支持全文索引;只有字段的數據類型爲 char、varchar、text 及其系列才能夠建全文索引。測試或使用全文索引時,要先看一下本身的 MySQL 版本、存儲引擎和數據類型是否支持全文索引。

索引準則

  • 索引不是越多越好
  • 不要對常常變更的數據加索引
  • 小數據量的表建議不要加索引
  • 索引通常應加在查找條件的字段

索引的數據結構

hash類型的索引:查詢單條快,範圍查詢慢
btree類型的索引:b+樹,層數越多,數據量指數級增加(咱們就用它,由於innodb默認支持它)

不一樣的存儲引擎支持的索引類型也不同

  • InnoDB 支持事務,支持行級別鎖定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  • MyISAM 不支持事務,支持表級別鎖定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  • Memory 不支持事務,支持表級別鎖定,支持 B-treeHash 等索引,不支持 Full-text 索引;
  • NDB 支持事務,支持行級別鎖定,支持Hash 索引,不支持 B-treeFull-text 等索引;
  • Archive 不支持事務,支持表級別鎖定,不支持 B-treeHashFull-text 等索引;

權限管理

用戶管理

基本命令

/* 用戶和權限管理 */ 
用戶信息表:mysql.user

-- 刷新權限
FLUSH PRIVILEGES

-- 增長用戶 CREATE USER chen IDENTIFIED BY '123456'
CREATE USER 用戶名 IDENTIFIED BY [PASSWORD] 密碼(字符串)
 - 必須擁有mysql數據庫的全局CREATE USER權限,或擁有INSERT權限。
 - 只能建立用戶,不能賦予權限。
 - 用戶名,注意引號:如 'user_name'@'192.168.1.1'
 - 密碼也需引號,純數字密碼也要加引號
 - 要在純文本中指定密碼,需忽略PASSWORD關鍵詞。要把密碼指定爲由PASSWORD()函數返回的
混編值,需包含關鍵字PASSWORD

-- 重命名用戶 RENAME USER chen TO chen1
RENAME USER old_user TO new_user

-- 設置密碼
SET PASSWORD = PASSWORD('密碼')   -- 爲當前用戶設置密碼
SET PASSWORD FOR 用戶名 = PASSWORD('密碼')   -- 爲指定用戶設置密碼

-- 刪除用戶 DROP USER chen1
DROP USER 用戶名

-- 分配權限/添加用戶
GRANT 權限列表 ON 表名 TO 用戶名 [IDENTIFIED BY [PASSWORD] 'password']
 - all privileges 表示全部權限
 - *.* 表示全部庫的全部表
 - 庫名.表名 表示某庫下面的某表
 
-- 查看權限  SHOW GRANTS FOR root@localhost;
SHOW GRANTS FOR 用戶名

  -- 查看當前用戶權限
 SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR
CURRENT_USER();

-- 撤消權限
REVOKE 權限列表 ON 表名 FROM 用戶名
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用戶名   -- 撤銷全部權限

權限解釋

-- 權限列表
ALL [PRIVILEGES]   -- 設置除GRANT OPTION以外的全部簡單權限
ALTER   -- 容許使用ALTER TABLE
ALTER ROUTINE   -- 更改或取消已存儲的子程序
CREATE   -- 容許使用CREATE TABLE
CREATE ROUTINE   -- 建立已存儲的子程序
CREATE TEMPORARY TABLES     -- 容許使用CREATE TEMPORARY TABLE
CREATE USER     -- 容許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL
PRIVILEGES。
CREATE VIEW     -- 容許使用CREATE VIEW
DELETE   -- 容許使用DELETE
DROP   -- 容許使用DROP TABLE
EXECUTE     -- 容許用戶運行已存儲的子程序
FILE   -- 容許使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX   -- 容許使用CREATE INDEX和DROP INDEX
INSERT   -- 容許使用INSERT
LOCK TABLES     -- 容許對您擁有SELECT權限的表使用LOCK TABLES
PROCESS   -- 容許使用SHOW FULL PROCESSLIST
REFERENCES   -- 未被實施
RELOAD   -- 容許使用FLUSH
REPLICATION CLIENT   -- 容許用戶詢問從屬服務器或主服務器的地址
REPLICATION SLAVE   -- 用於複製型從屬服務器(從主服務器中讀取二進制日誌事件)
SELECT   -- 容許使用SELECT
SHOW DATABASES   -- 顯示全部數據庫
SHOW VIEW   -- 容許使用SHOW CREATE VIEW
SHUTDOWN   -- 容許使用mysqladmin shutdown
SUPER   -- 容許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,
mysqladmin debug命令;容許您鏈接(一次),即便已達到max_connections。
UPDATE   -- 容許使用UPDATE
USAGE   -- 「無權限」的同義詞
GRANT OPTION   -- 容許授予權限
-- 分析和存儲表的關鍵字分佈
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ...
-- 檢查一個或多個表是否有錯誤
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
-- 整理數據文件的碎片
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

MySQL備份

數據庫備份必要性

  • 保證重要數據不丟失
  • 數據轉移

MySQL數據庫備份方法

  • mysqldump備份工具
  • 數據庫管理工具,如SQLyog
  • 直接拷貝數據庫文件和相關配置文件

mysqldump客戶端

做用 :

  • 轉儲數據庫
  • 蒐集數據庫進行備份
  • 將數據轉移到另外一個SQL服務器,不必定是MySQL服務器

-- 導出
1. 導出一張表 -- mysqldump -uroot -p123456 school student >D:/a.sql
mysqldump -u用戶名 -p密碼 庫名 表名 > 文件名(D:/a.sql)
2. 導出多張表 -- mysqldump -uroot -p123456 school student result >D:/a.sql
mysqldump -u用戶名 -p密碼 庫名 表1 表2 表3 > 文件名(D:/a.sql)
3. 導出全部表 -- mysqldump -uroot -p123456 school >D:/a.sql
mysqldump -u用戶名 -p密碼 庫名 > 文件名(D:/a.sql)
4. 導出一個庫 -- mysqldump -uroot -p123456 -B school >D:/a.sql
mysqldump -u用戶名 -p密碼 -B 庫名 > 文件名(D:/a.sql)

-- 導入
1. 在登陸mysql的狀況下: -- source D:/a.sql
source 備份文件
2. 在不登陸的狀況下
mysql -u用戶名 -p密碼 庫名 < 備份文件
相關文章
相關標籤/搜索