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存储,并发访问量大。