1. 程式人生 > >淺談資料庫(五)

淺談資料庫(五)

1、資料備份(mysqldump,在Linux終端操作)
  1、命令格式
    mysqldump -u使用者名稱 -p 源庫名 > ***.sql
  2、源庫名的表示方式
    --all-databases    備份所有庫
    庫名               備份1個庫
    -B 庫1 庫2 庫3     備份多個庫
    庫名 表1 表2 表3   備份多張表
  3、練習
    1、備份所有庫,放到mydata目錄下 :All.sql
      mysqldump -uroot -p --all-databases > All.sql
    2、備份db4庫中的 sheng、city、xian三張表,db4scx.sql
      mysqldump -uroot -p db4 sheng city xian > db4scx.sql
    3、備份MOSHOU和db4兩個庫,md.sql
      mysqldump -uroot -p -B db4 MOSHOU > md.sql
2、資料恢復
  1、命令格式(Linux終端)
    mysql -u使用者名稱 -p 目標庫名 < ***.sql
  2、從所有庫備份All.sql中恢復某一個庫
    mysql -u使用者名稱 -p --one-database 庫名 < All.sql
    mysql -uroot -p --one-database db4 < All.sql
  3、示例
    1、在db4.sheng新增一條記錄
      insert into sheng values(null,300000,"黑龍江");
    2、在db4庫,新建一張表t888
      create table t888(id int);
    3、從 db4.sql 恢復db4庫
      mysql -uroot -p db4 < db4.sql
    注意 :
      1、恢復庫時,如果恢復到原庫會將表中資料覆蓋,新增表不會刪除
      2、恢復庫時,如果庫不存在,則必須先建立空庫
3、MySQL調優
  1、建立索引
    在select、where、order by常涉及到的欄位建立索引
  2、選擇合適儲存引擎
    1、讀操作多 :MyISAM
    2、寫操作多 :InnoDB
  3、SQL語句優化(避免全表掃描)
    1、where子句儘量不使用 != ,否則放棄索引全表掃描
    2、儘量避免NULL判斷,全表掃描
      優化前:
        select number from t1 where number is null;
      優化後:
        在number欄位設定預設值0,確保number欄位無NULL
        select number from t1 where number=0;
    3、儘量避免用or連線條件,否則全表掃描
      優化前:
        select id from t1 where id=10 or id=20;
      優化後:
        select id from t1 where id=10
        union all
	select id from t1 where id=20;
    4、模糊查詢儘量避免使用前置 %,否則全表掃描
      select variable from t1 where name="secure%";
    5、儘量避免使用in和not in,否則全表掃描
      優化前 :
        select id from t1 where id in(1,2,3,4);
      優化後 :
        select id from t1 where id between 1 and 4;
    6、不能使用 select * ...
      用具體欄位代替*,不要返回用不到的任何欄位
4、事務和事務回滾
  1、定義 :一件事從開始發生到結束的整個過程
  2、作用 :確保資料一致性
  3、事務和事務回滾應用
    1、SQL命令會 autocommit 到資料庫執行
    2、事務操作
      1、開啟事務
        mysql> begin;   |  start transactions;
        mysql> SQL命令 ... 
	  ## 此時autocommit被禁用 ##
      2、終止事務
        mysql> commit; | rollback;
    3、案例
      1、背景
        你 :建行卡
	朋友 :工行卡
	你在建行自動取款機 給你朋友 轉5000塊錢
      2、建表
        表1、CCB
          create table CCB(
	  name varchar(20),
	  money decimal(20,2)
	  );
	  insert into CCB values("有錢人",100000);
	表2、ICBC
	  create table ICBC(
	  name varchar(20),
	  money decimal(20,2)
	  );
	  insert into ICBC values("沒錢人",0);
      3、開始轉賬
	成功:
        mysql> begin;
	mysql> update CCB set money=money-5000 where name="有錢人";
	mysql> update ICBC set money=money+5000 where name="沒錢人";
	mysql> commit;
	#####轉賬成功#####

	失敗 :
	mysql> begin;
	mysql> update CCB set money=money-5000 where name="有錢人";
	mysql> update ICBC set 工行伺服器故障... ;
	mysql> rollback;
	#####轉賬失敗#####
5、與Python互動
  1、互動型別
    1、python3
      模組名 :pymysql
      安裝 :
        1、線上 :sudo pip3 install pymysql
	2、離線 :pymysql.tar.gz
	  解壓:setup.py
	        python3 setup.py install
    2、python2
      模組名 :MySQLdb
      安裝 :sudo pip install mysql-python
  2、pymysql使用流程
    1、建立資料庫連線物件(db=pymysql.connect("root".
    2、建立遊標物件cur(操作資料庫的物件)
    3、遊標物件:cur.execute("insert into sheng ...;")
    4、提交到資料庫執行 :db.commit()
    5、關閉遊標物件cur.close()
    6、關閉資料庫連線物件db.close()
    示例 :01_pymysql示例.py
  3、connect連線物件
    1、db = pymysql.connect(引數列表)
      1、host :主機地址
      2、user :使用者名稱
      3、password :密碼
      4、database :庫
      5、charset :編碼方式,推薦utf8
      6、port :埠(3306)
    2、db (資料庫連線物件) 的方法
      1、db.close() :斷開連線
      2、db.commit() :提交到資料庫執行
      3、db.cursor() :遊標物件,用來執行SQL命令
      4、db.rollback() :回滾
    3、cursor 遊標物件 的方法
      1、execute(SQL命令) :執行SQL命令
      2、close() :關閉遊標物件
      3、fetchone() :獲取查詢結果的第1條資料
      4、fetchmany(n) :獲取n條資料
      5、fetchall() :獲取所有資料
      ## fetchmany(n) 和 fetchall() 得到的結果一定是一個大元組套著小元組 ((),(),())
6、WorkBench 圖形化介面管理工具
   Navicat : Windows中圖形化介面管理工具
7、orm(Object Relation Mapping) 物件關係對映
  1、示例
    import sqlalchemy

    class User:
        __tablename__ = "t1"
	id = Column(Integer,primary_key=True)
	name = Column(String(20))

    解釋:
      一個類 User --> 資料庫1張表
      表中2個欄位 :id 和 name