初識Mysql(二)
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(二)