資料庫高階(事物、檢視、索引)
– 事物(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方式
-- 遠端登入(謹慎使用)