第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 *.* replication@192.168.0.4 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 使用php