1. 程式人生 > 其它 >資料庫 sql語句的執行過程

資料庫 sql語句的執行過程

1.

 

聯結器:

  tcp 協議

  連線和斷開

  校驗許可權、使用者名稱、密碼

  連線數:show processList; kill  show global variables like 'wait _timeout';

  預設休眠時間:8小時

  連線後,快取了使用者資訊,資料庫更改了許可權等,需要重新登連線才生效

  建立使用者:create user 'xtc'@'localhost' identified by '123456';

  更改使用者許可權:grant all privileges on *.* to 'xtc'@'localhost';

  重新整理許可權: flush privileges;

  更改密碼:alter user 'xtc'@'%' identified by '654321';

  更改訪問許可權:update user set host='%' where user='xtc';

  查詢表結構:describe user;

   

查詢快取:

  檢視快取狀態:show global variables like "query_cache_type";

  開啟快取 :/etc/mysql/my.cnf   增加 query_cache_type=demand (只有查詢中增加 SQL_CACHE 才能命中)    off 關閉 預設  on 開啟   更改後需要重啟

  檢視命中數量和儲存適量 show  status like "%Qcache%"  

        

 

  • Qcache_free_blocks:表示查詢快取中目前還有多少剩餘的blocks,如果該值顯示較大,則說明查詢快取中的記憶體碎片過多了,可能在一定的時間進行整理。
  • Qcache_free_memory:查詢快取的記憶體大小,通過這個引數可以很清晰的知道當前系統的查詢記憶體是否夠用,是多了,還是不夠用,DBA可以根據實際情況做出調整。
  • Qcache_hits:表示有多少次命中快取。我們主要可以通過該值來驗證我們的查詢快取的效果。數字越大,快取效果越理想。
  • Qcache_inserts: 表示多少次未命中然後插入,意思是新來的SQL請求在快取中未找到,不得不執行查詢處理,執行查詢處理後把結果insert到查詢快取中。這樣的情況的次數,次數越多,表示查詢快取應用到的比較少,效果也就不理想。當然系統剛啟動後,查詢快取是空的,這很正常。
  • Qcache_lowmem_prunes:該引數記錄有多少條查詢因為記憶體不足而被移除出查詢快取。通過這個值,使用者可以適當的調整快取大小。
  • Qcache_not_cached: 表示因為query_cache_type的設定而沒有被快取的查詢數量。
  • Qcache_queries_in_cache:當前快取中快取的查詢數量。
  • Qcache_total_blocks:當前快取的block數量。

 

詞法分析器:把sql 語句解析成一棵語法樹,

優化器: 選擇索引

執行器:呼叫引擎介面

 

bin-log:

  server層 引擎公用

  二進位制檔案

  不限大小,追加寫入,不會覆蓋之前檔案

  檢視是否開啟:show global variables like "%log_bin%";

  開啟:/etc/mysql/my.cnf  增加: 

    log-bin=/user/local/mysql/data/binlog/mysql-bin  需要給該目錄賦予許可權

    server-id =1 5.7以後需要增加  是唯一標識 自己定義

    binlog-format=row  #binlog格式,有3種statement  只記錄執行 但是效率低 可能會有主從不一致的問題,row 記錄sql執行後的結果 效率低 安全性好,mixed 兩者結合

    sync-binlog=1 #表示每1次執行寫入就與硬碟同步,會影響效能,為0時表示,事務提交時mysql不做刷盤操作,由系統決定

  會在指定的目錄生成mysql-bin-000001檔案

  檢視binlog檔案:

  /usr/bin/mysqlbinlog --no-defaults  /usr/local/mysql/data/binlog/mysql-bin.000001

  

  mysql> show variables like '%log_bin%'; 檢視bin-log是否開啟   mysql> flush logs; 會多一個最新的bin-log日誌   mysql> show master status; 檢視最後一個bin-log日誌的相關資訊   mysql> reset master; 清空所有的bin-log日誌

 

從bin-log恢復資料 恢復全部資料 /usr/bin/mysqlbinlog  --no-defaults /usr/local/mysql/data/binlog/mysql-bin.000001 |mysql -uroot -p superzig-operatingtable-1 恢復指定位置資料 /usr/bin/mysqlbinlog --no-defaults --start-position="74311" --stop-position="74582"  /usr/local/mysql/data/binlog/mysql-bin.000001 |mysql -uroot -p superzig-operatingtable-1 恢復指定時間段資料 /usr/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/binlog/mysql-bin.000001 --stop-date= "2018-03-02 12:00:00"  --start-date= "2019-03-02 11:55:00"|mysql -uroot -p superzig-operatingtable-1