1. 程式人生 > >初識Mysql(二)

初識Mysql(二)

方式 優點 ren 1.2 ext primary lte mysq 寫鎖

1 mysql索引


2 主鍵的使用(primary key)

3 外鍵(foreign key)

4 存儲引擎



1 mysql索引

1.1 索引概述

相當與“書的目錄”

1.2 索引優點與缺點

優點:加快查詢的速度

缺點:占用物理存儲空間;減慢寫的速度;

1.3 使用索引

在表中的字段上創建索引

普通索引 index

規則:一個表中可以有多個index字段;字段的值允許重復,可以賦空值

key標誌是MUL

index_type:BTREE(二叉樹) ;B+TREE ;Hash

Key_name: abc #索引名稱

Column_name: std_id #字段名

show index from 表名\G;#查看索引詳細信息\分行

創建索引:

創建時指定索引字段:

create table 表名(字段1,字段2, ...index(字段1),index(字段2) );

已有表中指定索引字段:

create index 索引名 on 表名(字段名);

刪除索引:

drop index 索引名 on 表名;

1.4 唯一索引(unique)

一個表中可以有多個unique字段;

對應的字段值不允許重復

KEY的標誌是UNI

字段的值允許為NULL,當修改為不允許為NULL,則此字段限制與主鍵相同

創建唯一索引:

創建時指定索引字段:

create table 表名(字段1,字段2, ... unique(字段1),unique(字段2) );

已有表中指定索引字段:

create unique index 索引名 on 表名(字段名);

案例:新建table t27表,字段名為姓名,護照,駕駛證

mysql> create table t27(name char(10),

-> passport_id char(5),

-> drive_id char(5),

-> unique(passport_id),

-> unique(drive_id);

此時 desc t27 顯示的Key為UNI

mysql> insert into t27 values("bob","aaa","bbb");

mysql> insert into t27 values("bob","asaa","sbbb");

passport_id列的值 ,drive_id列值各自不能相同

mysql> insert into t27 values("lisi",null,null); #不允許賦空值

ERROR 1048 (23000): Column 'passport_id' cannot be null

mysql> alter table t27 modify passport_id char(5) not null ;

此時 desc t27 顯示的passport_id Key為PRI

mysql> alter table t27 drop primary key; #使用刪除主鍵的命令不能刪除

mysql> drop index passport_id on t27; #使用該命令刪除

2 主鍵的使用(primary key)

2.1 使用規則

一個表中只能有一個主鍵字段

對應的字段值不允許有重復,且不允許賦NULL值

如果有多個字段都作為primary key,稱為復合主鍵,必須一起創建;

主鍵的標誌是PRI;

通常與auto_increment連用。

2.2 創建

建表時創建:

create table 表名(字段1 primary key, ...);

create table 表名(字段1 ,字段2, ... primary key(字段));

在已有表中設置主鍵(考慮創建主鍵的條件,原字段為空,但是主鍵不允許為空)

alter table 表名 add primary key(字段名);

2.3 刪除主鍵:

alter table 表名 drop primary key;

2.4 復合主鍵

復合主鍵字段的值不允許同時重復;

必須同時創建;

建表時創建:

create table 表名(字段1 ,字段2, ... primary key(字段1,字段2));

在已有表中設置主鍵(考慮創建主鍵的條件)

alter table 表名 add primary key(字段名);

刪除復合主鍵

alter table 表名 drop primary key;

2.5 primary key與auto_increment連用

字段的值自動增長i++;

案例:

mysql> create table t26(id int(1) zerofill

primary key auto_increment,

-> name char(10),

-> age tinyint(2) unsigned,

-> sex enum("boy","girl")

-> );

mysql> insert into t26(name,age,sex) values("jim",18,"boy");

總結:id值不設置時,默認1,添加的自增加1;如果自己設置從最後的值+1

3 外鍵(foreign key)

3.1 外鍵

讓當前表字段的值在另一個表中字段值的範圍內選擇

使用外鍵的條件:

表的存儲引擎必須是innodb;

字段類型要一致;

被參考字段必須要是索引類型的一種(如:primary key).

3.2 創建外鍵:

foreign key(字段名) references 表名(字段名)

on update cascade 同步更新 on delete cascade 同步刪除

已有表創建外鍵

alter table 表名 add foreign key(字段名) references 表名(字段名)

on update cascade on delete cascade;

3.3 刪除外鍵:

alter table 表名 drop foreign key 約束名;

案例:創建2個表,分別為財務表和班級表,財務表記錄了整個年級學生的繳費情況,

如果想要統計班級內的學生的繳費情況,只需要查看std_id,

沒有繳費的學生在班級表內就寫不進去信息。

mysql> create table finace(std_id int(2) primary key auto_increment,

-> name char(10),

-> money float(7,2) default 5000)

-> engine=innodb;

mysql> create table stdinfo(std_id int(2),

-> name char(10),

-> money float(7,2) default 5000,

-> foreign key(std_id) references finace(std_id)

on update cascade on delete cascade)engine=innodb;

對finace表寫入數據,stdinfo表的std_id範圍必須在finace表的std_id範圍內,

且stdinfo表的std_id字段值會隨著finace表的std_id的字段值改變而改變。

(從屬表隨著主表改變,主表不會隨從屬表改變)

update finace set std_id=新值 where std_id=舊值;

delete from finace where std_id=值;

3.4 show create table 表名; #查看建表命令

| stdinfo | CREATE TABLE `stdinfo` (

`std_id` int(2) DEFAULT NULL,

`name` char(10) DEFAULT NULL,

`money` enum('yes','no') DEFAULT 'no',

KEY `std_id` (`std_id`),

CONSTRAINT `stdinfo_ibfk_1` FOREIGN KEY (`std_id`) REFERENCES `finace` (`std_id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

刪除外鍵字段:

alter table 表名 drop foreign key 約束名;

alter table stdinfo drop foreign key stdinfo_ibfk_1;

4 存儲引擎

4.1 mysql存儲引擎介紹

是數據庫服務自帶的功能程序,處理表的處理器;

存儲方式不一樣(在/var/lib/mysql/數據庫名/ 內存放的數據格式不同)

4.2 查看

查看表使用的存儲引擎:show create table 表名;

查看系統的存儲引擎:show engines; 或show engines\G;

4.3 修改

修改默認使用的存儲引擎:

vim /etc/my.cnf

[mysqld]

default-storage-engine=myisam

systemctl restart mysqld

建表指定使用的存儲引擎:

create table 表名(字段...)engine=引擎;

已有表修改:

alter table 表名 engine=引擎;

4.4 常用的存儲引擎以及特點

4.4.1 mysql鎖的機制:

鎖粒度

表級鎖:一次直接對整張表進行加鎖;

行級鎖:只鎖定某一行;

頁級鎖:對整個頁面進行加鎖;

鎖類型

讀鎖(共享鎖):支持並發讀;

寫鎖(互斥鎖):是獨占鎖,上鎖期間其他線程不能讀表或寫表;

4.4.2 myisam:

支持表級鎖定,不支持行級鎖定;

不支持事務;獨享表空間;多用在查詢,插入操作較多的表;

數據存儲方式:

3個表文件:包括xxx.frm:存放表結構;xxx.MYI:存放索引;xxx.MYD:存放數據

4.4.3 innodb:

支持表級/行級鎖定;

支持外鍵,支持事務回滾;共享表空間;

#事務(一次sql操作連接到斷開的過程,要麽成功,要麽失敗)

#事務回滾(事務執行過程,任意一步執行不成功,會恢復所有操作)

#innodb存儲引擎的表使用事務文件記錄執行過的sql操作,

#在/var/lib/mysql/下的ib_logfile0 和ib_logfile1 ibdata1

數據存儲方式:

2個表文件:包括:xxx.frm:存放表結構;xxx.ibd:存放索引和數據

4.4.4 查看鎖的狀態

show status like ‘Table_lock%’;# %作為通佩符

4.5 建表時如何決定表使用哪種存儲引擎

接收查訪問多的表,適合使用myisam存儲,節省系統資源。

接收寫訪問多的表,適合使用innodb存儲,並發訪問量大。

初識Mysql(二)