1. 程式人生 > >資料庫高階(事物、檢視、索引)

資料庫高階(事物、檢視、索引)

– 事物(ACID)

開啟事務

begin; 或者 start transaction;

-- 原子性 一致性
	第一步 開啟 終端1 終端2
	第二步 終端1 開啟事物 begin/start transaction
		   終端1 update 表名 set 欄位="xxx" where ...;
		   終端1 select * from 表名;  發現數據改變
	第三步 終端2 select * from 表名;  
		   發現數據其實並沒有改變 其實這個時候對資料的相關操作資訊存在快取中,
		   當commit之後,這些操作才會一次性的完成
	第四步 終端1 commit 資料數資料真的改變
		   終端2 select * from 表名,資料改變了
		
-- 隔離性
	第一步 開啟 終端1 終端2
	第二步 終端1 開啟事物 begin
		   終端1 update 表名 set 欄位="xxx" where ...;
	第三步 終端2 update 表名 set 欄位="yyy" where ...;
		   發現 處於阻塞狀態 
	第四步 終端1 commit
		   終端2 阻塞狀態解除 資料修改成 yyy
		   
-- 回滾(rollback)
	第一步 開啟 終端1 begin
	第二步 終端1 update 表名 set 欄位="xxx" where ...;
	第三步 rollback 資料返回最開始的原始值



-- 永續性
	-- 一旦事務提交,則其所做的修改會永久儲存到資料庫
	
-- 注意 
	-- innodb能使用事物
	-- 使用python操作資料庫的時候 預設開啟事物的 
	-- 但是python對資料庫進行增刪改的時候 需要手動commit
	
	-- 使用終端操作資料庫(也就是mysql的客戶端)的時候 也是預設開始事物的
	-- 只是在回車確認操作的時候 終端會預設的commit 所以我們不需要commit

– 事物最主要解決的問題 – 某些事情需要一次性完成 中途不允許出現中斷 例如銀行取錢 事物可以解決這種問題

– 什麼是檢視? – 通俗的講,檢視就是一條SELECT語句執行後返回的結果集。 – 所以我們在建立檢視的時候,主要的工作就落在建立這條SQL查詢語句上。

– 檢視的特點 – 檢視是對若干張基本表的引用,一張虛表,查詢語句執行的結果, – 不儲存具體的資料(基本表資料發生了改變,檢視也會跟著改變);

– 檢視的最主要的作用 – 如果資料庫因為需求等原因發生了改變,為了保證查詢出來的資料與之前相同, – 則需要在多個地方進行修改,維護起來非常麻煩,這個時候使用檢視就可解決這個問題

– 檢視的定義方式 – create view 檢視名稱(一般使用v開頭) as select語句; select goods.name2 as name,goods.price,goods_cates.name as cate_name from goods inner join goods_cates on goods.cate_id = goods_cates.id;

–具體場景使用 create view v_python21 as select goods.name as name,goods.price,goods_cates.name as cate_name from goods inner join goods_cates on goods.cate_id = goods_cates.id;

–複雜的sql可以使用檢視代替

v_python21 =select goods.name2 as name,goods.price,goods_cates.name as cate_name from goods inner join goods_cates on goods.cate_id = goods_cates.id;

– 刪除檢視 – drop view ; drop view v_python21;

– 注意 – 檢視只能用於查詢

– 檢視作用總結

– 1 提高了重用性,就像一個函式 – 2 讓資料更加清爽

– 索引 – 注意 – 要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引檔案。 – 對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了, – 對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

-- 建立索引會佔用磁碟空間

– 索引最主要解決的問題 – 當資料非常龐大時,並且這些資料不需要經常修改,為了加快查詢速度,我們會使用索引

– 建立一張表 create table test_index(title varchar(10)); – python插入10條資料

–測試步驟 1. 開啟執行時間監測: set profiling=1; 2. 查詢第1萬條資料ha-99999 select * from test_index where title=‘ha-99999’; 3. 檢視執行的時間: show profiles; 4. 為表title_index的title列建立索引: create index 索引名稱 on 表名(欄位名稱)

		create index my_index on test_index(title);
5. 執行查詢語句:
	select * from test_index where title='ha-99999';
6. 再次檢視執行的時間
	show profiles;

--檢視索引
	-- show index from 表名;
	show index from test_index;

--刪除索引

	---drop index 索引名 on 表名;
	drop index my_index on test_index;

– 許可權管理(瞭解) 對使用者的管理

-- 檢視有哪些賬戶
	1 使用root賬戶登入
	2 使用mysql資料庫
	3 使用者的資訊存放在 user 表中 
		-- select host,user,authentication_string from user;
			Host表示允許訪問的主機 % localhost
			User表示使用者名稱
			authentication_string表示密碼,為加密後的值
		select host,user,authentication_string from user;
			
-- 建立賬戶、授權 
	
	-- 案例一
	1 使用root賬戶登入
	
	2 建立賬戶並授予所有許可權(部分許可權)
	-- grant 許可權列表 on 資料庫 to '使用者名稱'@'訪問主機' identified by '密碼';(語法格式)
	grant select on jing_dong.* to 'python21'@'localhost' identified by '123';
		
		
		-- 注意
		-- 1 訪問主機通常使用 百分號% 表示此賬戶可以使用任何ip的主機登入訪問此資料庫
		-- 2 訪問主機可以設定成 localhost 或具體的ip,表示只允許本機或特定主機訪問
		
	-- 檢視使用者有哪些許可權
	-- show grants for 使用者@訪問主機;
	show grants for [email protected]'localhost';

		
	3 退出root的登入 使用新賬戶登入
	-- 使用查詢操作是可以的,(插入也可以)
	
	-- 使用其他操作是不可以的
		
		
	
	-- 案例二
	1 使用root賬戶登入
	
	2 建立賬戶並授予所有許可權(所有許可權) all privileges
	--grant 許可權列表 on 資料庫 to '使用者名稱'@'訪問主機' identified by '密碼';(語法格式)
	-- 注意 訪問連結設定成 % 十分危險 不要使用
		grant all privileges on jing_dong.* to 'python22'@'%' identified by '222';

			% 可以遠端 localhost只能本地 以後儘量不要開遠端
			
	-- drop user 刪除
	-- grant 授權
	
-- 修改許可權(增加)
	1 使用root賬戶登入
	
	2 修改使用者許可權
	-- grant 許可權名稱 on 資料庫 to 賬戶@主機 with grant option;(語法格式)
	grant update on jing_dong.* to 'python21'@'localhost' with grant option;
	
	3 重新整理許可權
		flush privileges;
		
-- 修改密碼
	1 使用root賬戶登入
	
	2 選擇mysql資料庫
	
	3 使用password()函式進行密碼加密 對user表進行修改
	-- update user set authentication_string=password('新密碼') where user='使用者名稱';(語法格式)
	# 對稱與非對稱加密
	例:update user set authentication_string=password('333') where user='python21';

	4 重新整理許可權
		flush privileges;
	
-- 刪除使用者
	1 使用root賬戶登入
	
	2 刪除使用者
		第一種方式  drop user '使用者名稱'@'主機';(語法格式)  解除安裝
		
					例:drop user 'python21'@'%';
					
					
		第二種方式	delete from user where user='使用者名稱';(語法格式)  手動刪除
		
					例:delete from user where user='python21';
					
					-- 操作結束之後需要重新整理許可權
					flush privileges
					
	-- 推薦使用語法1刪除使用者, 如果使用語法1刪除失敗,採用語法2方式


-- 遠端登入(謹慎使用)