1. 程式人生 > >《php與mysql權威指南》第三部分02

《php與mysql權威指南》第三部分02

第14章 mysql資料庫開發
14.1 mysql資料型別
  1.數值型別:
    五種整型:tinyint,smallint,mediumint,int,bigint分別為1,2,3,4,8位元組數
    三種浮點型:float,double,decimal分別4,8,m位元組
    # 宣告一個整數型別時,要給它指定一個顯示寬度,只是以多少寬度顯示,並不是數值的款單,所佔空間是固定的,例如bigint(4),顯示設定為4,所佔還是8個位元組,最大取值不變
  2.字串型別
    char(M);//m個位元組,其中0<=m<=255
    varchar(M);//L+1個位元組,其中L<=M,且0<=m<=255
    binary(M);//m個位元組,其中0<=m<=255
    varbinary(M);//L+1個位元組,其中L<=M,且0<=m<=255
    tinyblob,tinytext;//L+1個位元組,其中L<28
    blob,text;//L+2個位元組,其中L<216
    mediumblob,mediumtext;//L+3個位元組,其中L<224
    longblob,longtext;//L+4個位元組,其中L<232
    enum(v1,v2,...);//1或2個位元組,取決於列舉的個數
    set(v1,v2,...);//1,2,3,4,8個位元組,取決於set成員數目
    # char是固定長度型別,varchar是可變長度型別
    # set與enum區別:set允許成員同事出現,enum只允許出現一個成員
14.2 字符集支援


  檢視支援的字符集:show character set;
  查詢名字以utf8開頭的校對規則:show collation like 'utf8%';
  # ci(大小寫不敏感),cs(大小寫敏感),bin(二元)
14.3 索引的使用
  myISAM表,資料行存放在資料檔案裡,索引值放在索引檔案裡。InnoDB->索引是排好序的陣列,資料行與索引值存放在同一個檔案裡,同一個表空間中
  1.資料庫索引
    優點:查詢優化,唯一性,文字搜尋
  2.主要索引介紹
    主鍵索引:
    唯一索引:
    常規索引:
    全文索引:
    # 每個表只能有一個主鍵索引,可以有多個唯一索引
    # 缺點:佔用磁碟的空間多,降低插入更新和刪除的操作速度
  3.最佳實踐
    只對where和order需要的列新增索引
    建立index(first,last)就再不要建立index(first)索引
    索引列not null
    不適用索引的查詢,使用選項-log-long-format來記錄日誌,然後檢查日誌檔案對查詢進行優化
    explain語句有助於確定mysql如何執行查詢
    # explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句
    最好使用唯一索引
    索引長度儘量短
    充分利用左側字首(複合索引)
    索引不宜過多
    檢視日誌
  4.新建索引:create index index_name on table (field1,field2);
14.4 事務處理

  事務開始、提交、回滾
  原則:原子性,一致性,隔離性,永續性
  # InnoDB支援事務
  1.非事務實現方法:縮影資料表
    lock_tables/unlock tables
  2.事務實現方法
    begin/commit/rollback
    set autocommit=1;//開啟自動提交,set autocommit=0;//關閉自動提交,預設開啟
14.5 外來鍵與資料的完整性
  外來鍵:是把一個表中的索引列與另一個表中的索引列關聯起來
    foreign key ('index_name') referrences 'tbl_name' ('index_columns') [on delete action][on update action]
    # 其中index_name為字表的外來鍵欄位名,tbl_name為父表名稱,index_columns為外來鍵所關聯的父表字段
    # on delete說明當父表記錄被刪除時,子表的變化,有如下值:
      on delete casecade->與之關聯的子表記錄也被刪除
      on delete set null->與之關聯的子表外來鍵被設定成null
      on delete no action->產生錯誤並回滾delete語句
    # on update說明當父表記錄被更改時,子表的變化,有如下值
      on update casecade->與之關聯的子表外來鍵也被更改
      on update set null->與之關聯的子表外來鍵被設定成null
      on update no action->產生錯誤並回滾update語句
    //構成外來鍵關係的父表和子表必需是被索引的
    //父表索引與子表索引相對應的資料列的型別必需是相容的
14.6 資料庫內部語句和語法

  1.alter {database|schema}[db_name] alter_specification[,alter_specification1]...
  其中alter_specification->[default] charater set charset_name|[default] collate set collation_name
  2.alter [ignore] table tbl_name alter_specification
  其中alter_specification常用功能如下:
    1)新增列:alter table tbl_name add [column] column_definition
    2)新增索引:alter table tbl_name add [index|primary key|fulltext] [index_name] [index_type] [index_col_name,...] ,其中索引型別如下
      A.index->基本索引
      B.unique->唯一索引
      C.primary key->主鍵索引
      D.fulltext->全文字搜尋
    3)增加外來鍵:alter table tbl_name add foreign key [index_name] [index_col_name,...];//只有InnoDB支援外來鍵
    4)更改表資訊:alter table tbl_name change old_col_nmae column_definition
    5)刪除表資訊:alter table tbl_name drop...
    6)停止更新、重新建立索引(disable keys/enable keys):在大量插入|更新操作前建議先禁用索引,完成後重新建立索引
    7)分割槽:
      create table t1(
      id int ,
      year_col int
      )
      partition by range(year_col)(
      partition p0 values less then (1991),
      partition p1 values less then (1995),
      partition p2 values less then (2000),
      );
      //新增分割槽
      alter table t1 add partition p3 values less then (2002);
      //刪除分割槽
      alter table drop partition p0,p1;
      # 刪除時分割槽內的資料也被取消
  3.建立資料庫:create database {database|schema} [if not exists] db_name[(create_specification)]
  4.建立索引:create [unique|fulltext|spartial] index index_name [using index_type] on tbl_name(index_col_name),其中  index_col_name->col_name[(length)][asc|desc]
  5.建立表:create [temporary] table [if not exist] tb_name (...)
  6.刪除資料庫:drop databese [if exists] db_name
  7.刪除索引:drop inde index_name on tb_name
  8.刪除表:drop [temporary] table [if exists] tb_name,tb_name2...
  9.重命名錶:rename tb_name to new_tb_name,tb_name2 to new_2;
14.7 資料庫操作語句和語法
  1.刪除
    delete from tb_name where...
    delete ta_name[.*][,tb_name2[.*]...] from table_references where;
    delete from ta_name[.*][,tb_name2[.*]...] using table_references where...;
  2.do:指定表示式,不返回任何結果
    示例:do get_lock('str',10)
  3.handler語法:提供通往表儲存引擎介面的直接通道
    handler tb_name open [as alias] # 開啟一個表
    handler tb_name read index_name {= | >= | <= | <} (values1,...) where...limit.. # 建立讀取表的通道
    handler tb_name read index_name {first|next|prev|last} where...limit...
    handler tb_name read index_name {first|next} where...limit...
    handler tb_name close #關閉
  4.insert
    insert into tb_name (field1,field2..)values(v1,v2)
    insert into tb_name set filed=v1,filed2=v2...
    insert into tb_name select
  5.load data infile將資訊從一個文字檔案中告訴的讀入表中
    6.select * from tb_name,join,group by,order by,limit,having,like,and,in,not in,or,any,between,union
  7.truncate [table] tb_name:刪除表再建立表,多用於清空
  8.update
  9.explain tb_name|explain select ...:顯示錶結構|解釋如何執行select語句
14.8 儲存過程:為了完成特定功能、經編譯後儲存在資料庫中sql語句集,使用者通過指定儲存過程的名字並給出引數來執行
  優點:靈活性、一致性、高效性、安全性
  1.建立:
    create procedure sp_name([proc_parameter[,..]])
    begin
    satement block
    end
    示例:
      -----
      mysql>create procedure sp(in inputid int)//有in out inout三種類型,in傳入引數,out向儲存過程外傳出引數,inout傳入修改後傳出,inputid為引數名,int為引數型別
      begin
        select * from nc_product where p_id=inputid
      end
      mysql>delimiter;
      -----
  2.呼叫儲存過程:call sp_name()
    示例:call sp(1)
  3.刪除儲存過程;dtop procedure sp_name
  4.show procedure status:顯示資料庫中所有儲存過程的基本資訊;show create procedure sp_name:用來顯示某個儲存過程的詳細資訊
第15章 mysql資料管理
15.1 mysql分割槽
  水平分割槽:對錶的行進行分割槽
  垂直分割槽:通過對錶的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分割槽,每個分割槽都包含了其中的列所對應的行
  一般都採取水平分割槽,其中水平分割槽還包括如下分割槽
    1.range(範圍)分割槽:允許DBA將資料劃分為不同的範圍
    示例:
      -----
      create table employees(
      id int not null,
      fname varchar(30),
      lname varchar(30),
      ...
      strore_id int not null,
      )
      partition by range(store_id)(
      partition p0 valuse less then (11),
      partition p1 valuse less then (16),
      partition p2 valuse less then (21),
      partition p3 valuse less then (26),
      )
      -----
      # 當需要刪除舊的資料時
      # 想要使用一個包含有日期或時間值或者包含有從一些其他級數開始增長的值的列
      # 經常執行直接一來分割表的查詢
      # 刪除分割槽: alter table employees drop partition p2;
      # 新增分割槽: alter table employees add partition (partition p4 values less than (31));
      # 往前新增分割槽:alter table employees reorganize partition p0 into (partition s0 values less than (6),partition s1 values less than (11));
    2.list(預定義列表)分割槽:允許通過dba定義的列表的值所對應的行資料進行分割
    示例:
      -----
      create table employees(
      id int not null,
      fname varchar(30),
      lname varchar(30),
      ...
      strore_id int not null,
      )
      partition by range(store_id)(
        partition pe valuse in (1,3,5,7),
        partition pn valuse less then (2,4,6,8),
        partition pw valuse less then (9,11,13),
        partition pc valuse less then (10,12,14),
      );
      # 與地區相關
      -----
    3.hash(雜湊)分割槽:允許DBA通過對錶的一個或多個列的hash key進行計算,最後通過這個hash碼來對不同資料區域進行分割槽,例如可以建立一個對錶的主鍵進行分割槽的表
    4.key(鍵值)分割槽:是hash模式的延伸,這裡的hash key是由mysql系統產生的
    5.composite(複合模式)分割槽:以上模式分割槽的組合
      好處:提升新能、簡化資料管理
15.2 mysql的備份
  mysqldump [options] db_name tables>filename;
  mysqldump [options] ---database db1 [db2...]>filename;
  mysqldump [options] --all--database>filename;
  # 其中[options]代表-h host -u root -p paswd
15.3 mysql恢復
  匯入檔案:mysql -u root -p < filename
15.4 mysql複製:單向複製和非同步複製
  主從非同步複製的配置如下:
  master:192.168.0.3
  slave:192.168.0.4
  database:db_shopnc
  1.在master伺服器中啟動mysql
    1)在主伺服器上為伺服器設定一個連線賬戶。該賬戶需授予replication slave的許可權
      ---
      mysql>grant replication slave on *.* [email protected] identified by 'password';
      mysql>flush privileges;
      ---
    2)請空所有表和塊寫入語句
      ---
      mysql>flush tables with read lock;
      ---
    3)重新開啟已終端,備份想要複製的資料
      ---
      tar zcxf db_shopnc.tar.gz /opt/mysql/var/db_shopnc/
      scp db_shopnc.tar.gz 192.168.0.4:opt/mysql/var/ //將主伺服器的庫傳到slave相應的路徑下
      ---
    4)返回上一個終端,讀取主伺服器上當前的二進位制日誌名和偏移量值
      ---
      mysql>show master status;
      ---
    5)給資料庫解鎖
      ---
      mysql>unlock tables;
      ---
    6)編輯mysql配置檔案
      [mysqld]
      log-bin=myskq-bin
      server-id=1
      binlog-do-db=db_shopnc
  2.slave伺服器配置
    1)將從master中備份的庫解壓到相應路徑下
    2)修改my.cnf後,程式碼如下
      server-id=2
      master-hot=192.168.0.3
      master-user=replication
      master-password=password
      log-bin=
      # 每個從伺服器有唯一的server-id的值,且必須與主伺服器及其他從伺服器的值不同
  3.重啟master和slave的mysql服務
    1)先啟動master,再啟動slave
    2)slave伺服器重啟登入mysql
      ---
      mysql>stop slave;
      mysql>change master to master_host=192.168.0.3,master_user='replication',master_pawword='password',master_log_file='mysql-bin.000014',master_log_pos=98;
      mysql>start slave;
      mysql>show slave status\G;
      ...
      slave_io_running:yes
      slave_sql_running:yes
      ...
      ---
      # 兩個引數為yes時,證明主從複製成功
第16章 Mysql的儲存引擎及表型別
  支援多個儲存引擎為不同型別的處理器。從對事務支援的角度劃分,mysql儲存引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
    MyISAM管理非事務表
    memory儲存引擎可以提供'記憶體中'表
    InnoDB和BOB儲存引擎提供事務安全表
    example儲存引擎是一個'存根'引擎
    NDB是被mysql cluster 用來實現分割到許多臺計算機上的表的儲存引擎
    acheive儲存引擎非常適合儲存大量的、獨立的、作為歷史記錄的資料
    csv儲存引擎將資料以逗號分隔的格式儲存在文字檔案中
    blackhol儲存引擎接收單不儲存資料,並且檢索總是返回一個空集
    federated儲存引擎將資料儲存在遠端資料庫中
  engine|type定義儲存引擎,預設為MyISAM
  mysql總是建立一個.frm檔案來保持表和列的定義
  事務安全表(TST)比起非事務安全表(NTST)優勢如下:更安全;可以合併許多語句並用commit語句同時全部接受;可以執行rollback來忽略你的改變;如果更新失敗所有改變恢復到初始狀態;事務安全儲存引擎可以更好的保持資料完整性;
非事務安全的優勢如下:更快;需要更少的磁碟空間;執行更新需要更少的記憶體
16.1 MyISAM
  三個檔案:表名檔案,副檔名指出檔案型別,.frm檔案儲存表定義。資料檔案的副檔名為.myd,索引檔案的副檔名為.myi。
  特徵:所有資料值先儲存低位元組,資料庫與作業系統分離;先儲存資料低位元組並不影響速度;支援大檔案的檔案系統和作業系統;當刪除、更新和插入混合時,動態尺寸的行碎片更少;每個MyISAM的最大索引數是64;最大的鍵長度是1000位元組;blob和text可以被索引;在索引的列中允許null,其佔每個鍵0-1個位元組;當記錄以排好序的順序插入,索引樹被劈開以便高節點僅包含一個鍵,改善了索引樹的空間利用率;可以把資料檔案和索引檔案放在不同的目錄中;每個字元列都可以有不同的字符集
  1.啟動選項
    設定為崩潰時MyISAM表自動回覆的模式:--myisam-recover=mode
    用在塊插入優化中的樹緩衝區的大小:bulk_insert_buffer_size
    myisam_max_sort_file_size:索引緩衝區大小
    myisam_sort_buffer_size:設定恢復表時使用的緩衝區的尺寸
  2.損壞的myisam表
  3.未被適當關閉的表的問題
16.2 InnoDB儲存引擎:提供事務
  1.配置:
    Innodb_data_file_path=datafile_spec1[;datafile_spec2]..
  2.啟動選項:
  3.建立innodb表空間
    create table customers (a int,b char(20),index(a))engine=innodb
    create table customers (a int,b char(20),index(a))type=innodb
  4.處理innodb初始化問題
    沒建立一個innodb資料檔案目錄或innodb日誌目錄
    mysqld沒有訪問這些目錄的許可權建立檔案
    mysqld不能恰當的讀取my.ini或my.cnf選項檔案,因此不能看到指定的選項
    磁碟已滿或超出磁碟配額
    已經建立一個子目錄,名字與指定的資料檔案相同
    innodb_data_home_dir或innodb_data_file_path中有一個語法錯誤
  5.備份和恢復innodb
    手動備份:關閉伺服器-》福之所有資料檔案-》複製所有ib_logfile檔案到一個安全的地方-》複製my.cnf配置檔案到一個安全的地方-》為innodb表複製.frm檔案到一個安全的地方----》週期性的mysqldump轉儲資料庫
  6. 新增和刪除innodb資料和日誌檔案
16.3 merge儲存引擎
16.4 memory(heap)儲存引擎
16.5 bob(berkeleyDB)儲存引擎
...
第17章 phpMyAdmin-->圖形化管理工具
17.1 安裝與配置
17.2 使用