1. 程式人生 > >02: MySQL 索引類型 、 MySQL 存儲引擎

02: MySQL 索引類型 、 MySQL 存儲引擎

排它 資源 sam inno 共享鎖 btree 同時 索引 lte

day02
一、mysql索引
二、MySQL存儲引擎
+++++++++++++++++++++++++++++++++++
一、mysql索引
1.1 索引介紹 : 相當於 “書的目錄”

5000頁
1~200 目錄信息
拼音排序
部首排序
筆畫排序

201~5000 正文

1.2 索引的優點與缺點?
優點 加快查詢的速度
缺點 占用物理存儲空間,減慢寫的速度。

姓名 性別 班級 年齡
jim
jim
NULL

1.3 使用普通索引index:(在表中的字段上創建索引)
使用規則?
查看 desc 表名; key ----> MUL
show index from 表名;

Table: t23
Key_name: name
Column_name: name
Index_type: BTREE ( B+TREE Hash )
二叉樹
1-10
1-5 6-10
1-2.5 2.6-5

創建index 索引:
創建表時 指定索引字段
create table 表名(
字段名列表,
index(字段名1),
index(字段名2),
);
create table db1.t23(
name char(10) ,
sex enum("boy","girl") default "boy" ,

age tinyint(2) unsigned not null default 18,
index(name),
index(sex)
);
desc db1.t23;
show index from db1.t23\G;

在已有表裏創建index索引字段
create index 索引名 on 表名(字段);

刪除index索引 drop index 索引名 on 表名;

二、主鍵primary key 的使用
2.1 使用規則?

2.2 查看
desc 表名; key ----> MUL
show index from 表名;

2.3 創建
2.3.1 建表時創建
create table t25(
stu_id char(9) primary key ,
name char(10),
sex enum("boy","girl"),
age tinyint(2) unsigned
);
create table t24(
stu_id char(9),
name char(10),
sex enum("boy","girl"),
age tinyint(2) unsigned,
primary key(stu_id)
);
2.3.2 在已有表裏創建
alter table 表名 add primary key(字段名);
2.4 刪除主鍵 alter table 表名 drop primary key;

2.5復合主鍵的使用(表中多個字段一起做主鍵 ,復合主鍵字段的值不允許同時重復,要一起創建)
PRI PRI
name class pay
jim nsd1710 yes
jim nsd1712 no
建表時創建
create table db1.xfb(
name char(10),
class char(7),
pay enum("yes","no") default "no",
primary key(name,class)
);
驗證
insert into db1.xfb values("jim","nsd1710","yes");
insert into db1.xfb values("jim","nsd1710","yes");
insert into db1.xfb values("jim","nsd1710","no");
insert into db1.xfb values("bob","nsd1710","yes");
insert into db1.xfb values("bob","nsd1703","no");
刪除復合主鍵 alter table 表名 drop primary key;
在已有表裏添加復合主鍵。
alter table 表名 add primary key(字段名列表);
++++++++++++++++++++++++++++++++++++++++++
2.6 primary key 與 auto_increment 連用
字段的值自動增長i++ i=$i+1
數值類型
primary key

id name age sex
1 jim 21 boy
2 tom 19 boy
create table db1.t26(
id int(2) zerofill primary key auto_increment,
name char(10),
age tinyint(2) unsigned,
sex enum("boy","girl","no")
);

insert into db1.t26(name,age,sex) values("bob",21,"boy");
insert into db1.t26(name,age,sex) values("bob",21,"boy");
insert into db1.t26(name,age,sex) values("bob",21,"boy");
select * from db1.t26;

唯一索引 unique

          pri                pri

姓名 護照編號 駕駛證號
null null

使用規則?
查看 desc 表名; key ----> UNI

創建
建表時創建
create table db1.t27(
name char(10),
hz_id char(5),
jsz_id char(5),
unique(hz_id),
unique(jsz_id)
);
desc db1.t27;
insert into db1.t27 values("jim","aaa","bbb");
insert into db1.t27 values("jim","aaa","bbb");
insert into db1.t27 values("jim","aaab","bbbc");
insert into db1.t27 values("jim",null,null);

create table db1.t28(
name char(10),
hz_id char(5) not null,
jsz_id char(5),
unique(hz_id),
unique(jsz_id)
);
desc db1.t28;

在已有表裏創建unique
create unique index 索引名 on 表名(字段名);

刪除 drop index 索引名 on 表名;
+++++++++++++++++++++++++++++++++++++++
三、外鍵的使用
外鍵作用?
外鍵的使用規則?
創建外鍵:
foreign key(字段名) references 表名(字段名)
on update cascade on delete cascade

jfb 繳費表
學號
jfb_id name pay

create table db1.jfb(
jfb_id int(2) primary key auto_increment,
name char(10),
pay float(7,2) default 20000
)engine=innodb;

insert into db1.jfb(name)values("bob"),("tom");

bjb 班級表
外鍵
學號
bjb_id name pay

create table db1.bjb(
bjb_id int(2) ,
name char(10),
pay float(7,2) default 20000,
foreign key(bjb_id) references jfb(jfb_id)
on update cascade on delete cascade
)engine=innodb;

alter table bjb add primary key(bjb_id);

use db1;
show create table bjb;

驗證外鍵?
insert into bjb values(1,"bob",20000);
insert into bjb values(3,"lucy",20000);
insert into jfb(name)values("lucy");
insert into bjb values(3,"lucy",20000);

update 表名 set 字段名=值 where 條件;
update jfb set jfb_id=8 where jfb_id=2;
select from jfb;
select
from bjb;

delete from 表名 where條件;
delete from jfb where jfb_id=3;
select from jfb;
select
from bjb;

使用要註意的事項?

刪除外鍵 alter table 表名 drop foreign key 外鍵;
show create table bjb;
alter table bjb drop foreign key bjb_ibfk_1;
在已有表裏創建外鍵:
alter table bjb add foreign key(bjb_id) references jfb(jfb_id)
on update cascade on delete cascade;

+++++++++++++++++++++++++++++++++++
四、MySQL存儲引擎
4.1 MySQL存儲引擎介紹:是數據庫服務自帶的功能程序,
處理表的處理器
每種存儲引擎的功能和數據存儲方式都不同
4.2 查看
表使用的存儲引擎 show create table 表名;

數據服務使用的存儲引擎
show engines;
InnoDB | DEFAULT

4.3 修改
表使用的存儲引擎?
alter table 表名 engine=存儲引擎名;

建表時指定表使用的存儲引擎?
create table 表名(
字段名列表
.....
)engine=存儲引擎名;
數據服務使用的存儲引擎?
vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
.....
:wq
#systemctl restart mysqld
++++++++++++++++++++++++++++++++
4.4 生產環境中常用存儲引擎及特點
myisam特點
支持表級鎖
不支持外鍵 、事務、事務回滾
數據存儲方式 .frm .MYI .MYD
表結構 索引 數據
innodb特點
支持行級鎖、 外鍵 、事務、事務回滾
數據存儲方式 .frm .ibd
表結構 索引+數據

鎖的作用:解決並發訪問的沖突問題
鎖類型:讀鎖(共享鎖) 寫鎖(排它鎖)
鎖粒度:表鎖 行鎖 (頁鎖)

事務:一次sql操作從連接到斷開連接的過程稱為事務。要麽全部執行成功,任意一步錯誤,執行都失敗。

ATM
插卡
轉賬: 對方卡號 11111
匯款金額 50000
轉賬中。。。。。

退卡

事務回滾:事務執行過程,任意一步執行不成功,會恢復所有的操作。

innodb存儲引擎的表使用事務文件記錄執行過的sql操作。
cd /var/lib/mysql/db1/t1.*
ls
ib_logfile0
ib_logfile1
ibdata1

insert into t1 values(101),(102);

4.5 建表時如何決定表使用哪種存儲引擎
接收查訪問多的表,適合使用myisam存儲引擎,節省系統資源。
接收寫訪問多的表,適合使用innodb存儲引擎,並發訪問量大。

02: MySQL 索引類型 、 MySQL 存儲引擎