1. 程式人生 > >mysql資料庫學習筆記10-事務、檢視、索引

mysql資料庫學習筆記10-事務、檢視、索引

事務

============================================
    *) 事務是資料操作的最小單元

    *) 多個數據增刪改操作,完成的一項業務處理
    *) 如果事務事務成功,其中每一項操作都生效
        如果事務事務失敗,其中每一項操作都失敗
    *) 資料庫資料操作,以事務為一個最小操作單元,
        不應該以一個sql語句為一個操作單元;
        要麼整個事務成功,要麼整個事務失敗
    *) 事務的原子性
    *) 在當前事務中對資料的修改,只對當前連線可見

    *) ACID
        ------------
            A - 原子性 Atomic
            C - 一致性 Consistency
                    轉賬前 a+b = 100
                    轉帳後 a+b = 100
            I - 隔離性 Isolation
                    一個事物進行中時,
                    另一事物不能操作資料
            D - 永續性 Durancy
                    提交事務之後,
                    資料持久生效

*)事務操作

 *)開始事務
            
            start transaction;
            
            set autocommit=0;
        
        *)提交事務,事務結束
            
            commit;   
        
        *)回滾事務,事務結束
        
            rollback;
     
    *) mysql 預設不開始事務,需要手動啟動事務
        
        *)每一步資料修改都直接生效
        
        *)檢視事務是否開啟
            
            show variables like 'autocommit';
            
               自動提交開啟,沒有事務
               自動提交關閉,開始事務

        *)innodb 提供行級鎖
            
            一個事務修改一行資料未提交時,
            該行資料會被鎖定,
            不允許其他事務修改

    
    *)事務隔離級別(針對的是事務之間的)
          set tx_isolation='READ-UNCOMMITTED';
          set tx_isolation='read-committed';
          set tx_isolation='repeatable-read';
          set tx_isolation='serializable';
        
        1) 髒讀  READ-UNCOMMITTED 讀未提交資料
              
              一個事務修改一半的資料
              被其他事務讀取
        
        2) 不允許髒讀 read-committed 讀提交資料
              
              只能讀取其他事務已提交的資料
              
              虛讀 update
              幻讀 insert,delete
              
        
        3) 可重複讀 (mysql 預設) repeatable-read
              
              事務過程中,
              前後讀取的資料一致,
              
              即使過程中資料已被其他事務修改,
              也讀取舊的資料
        
        4) 序列化 serializable
              
              所有事務排隊依次執行,
              不能同時執行

        
        *) 檢視隔離級別
              
             show variables like 'tx%';

檢視 view

============================================
  * 將一個查詢的查詢結果當做表
  * 可以從這個虛擬的表查詢
  
    drop view if exists v1;
    
    create [or replace] view v1
    as
    selet ...;
  
  * 檢視不是表,不儲存資料,
    從檢視查詢時,
    本質是從查詢結果再查詢(兩層查詢)
  
  * 檢視檢視
      show tables;
      desc v1;
      show create view v1;
  
  * 為什麼使用檢視
      *)檢視在大的專案中非常常用
      
      *)簡化查詢
          select 
          from 
              a join b .. join c...join d...join e...
          
          select .. from v1;
      
      *)安全
          建立檢視給使用者訪問,
          隱藏真實資料表
      
      *)一般只從檢視查詢,不對檢視做增刪改操作


索引

==============================================
  * 資料儲存位置目錄
        *)雜湊索引
        *)紅黑樹索引
  
  * 提高查詢效率,首先考慮建立索引
        
  * where name='abc'
      
      name資料建立索引
  
  * where name='abc' and birth='1993-5-3'
      
      name和birth兩個欄位建立索引
        對 where name='abc' 單欄位過濾也有效
        但對 where birth='1993-5-3' 單欄位過濾無效
  
  * 建立索引
      
      create index index_name on tb1(name);
      
      create index first_name_index
      on employees(first_name);      
      
      create index job_dept_index
      on employees(job_id, department_id);


資料備份和恢復

================================================
  * 匯出庫表及資料
        
        mysqldump  -uroot -p 
        --default-character-set=utf8
        庫名>/home/soft01/hr.sql
  
        
        mysqldump  -uroot -p --default-character-set=utf8  stu>/home/soft01/stu.sql


        cat ~/stu.sql  |more
  
  * 將備份資料重新匯入資料庫
        
        mysql -uroot -p --default-character-set=utf8
        庫名<檔案路徑
                
        mysql -uroot -p --default-character-set=utf8
        stu2</home/soft01/stu.sql        
        
        drop database if exists jtds;
        create database jtds charset=utf8;
        將 jtds.sql 匯入 jtds 庫

limit

=================================================
  * limit 5
        前5條
  
  * limit 0,10
        從第一條開始的10條
  
  * limit 10,10
        從第十一條開始的10條
  
  * limit 20,10
        從第二十一條開始的10條
  
  * 查詢第 page 頁,每頁10條
        
        第一個引數:  (page-1)*10
        第二個引數:  10