第一节 索引
索引是帮助MySQL高效获取数据的数据结构
数据库在保存数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引可以大大提高MySQL的检索速度。
在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique和 Index。
图一
创建索引
create table 表名(id int not null,username varchar(16) not null,index(username(length)) ### 用username字段作为索引);
显示索引
show index from 表名;
删除索引
alter table 表名 drop index name;
图二
第二节 约束(constraint)
约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束
列级约束:针对某一字段来使用
表级约束:针对两个或两个以上的字段使用
约束类型包括:
not null(非空约束)
primary key (主键约束)
unique key (唯一约束)
default (默认约束)
foreign key(外键约束)
唯一(unique)约束
unique 约束唯一标识数据库表中的每条记录。
unique和primary key约束均为列提供了唯一性的保证。
primary key 被自动定义为unique 约束。
注意: 每个表可以有多个unique约束,但是每个表只能有一个primary key 约束。
第一种方式
create table persons(id_p int not null,address varchar(255),city varchar(255),phone varchar(11) unique # 定义字段的同时,定义约束);
第二种方式
create table persons(id_p int not null,address varchar(255),city varchar(255),phone varchar(11),unique phone(phone) # 单独一行命令,定义约束
第三种方式
alter table persons add unique city(city); 修改表
默认(default)约束
用于约束对应列中的值的默认值(除非默认为空值,否则不可插入空值)
create table persons(id tinyint primary key auto_increment,name varchar(30),sex enum('m','w') default 'm', # 定义sex默认值为:'m')
图三
主键(primary key)约束
每张数据表只能存在一个主键,主键保证记录的唯一性,主键自动为not null(同时作为表的索引)。
为没有主键的表添加主键
alter table 表名 add primary key (字段名)
外键(foreign key)约束
外键约束是为了保持数据一致性,完整性,实现一对一或一对多关系
子表(具有外键列的表)和 父表(子表所参照的表),存储引擎只能为innoDB。
外键列和参照列必须具有相似的数据类型。
– 如果是数字类型,数字的长度、是否有符号位 必须相同
– 字符类型的长度则可以不同
外键列和参照列必须创建索引(如果外键列不存在索引的话,MySQL将自动创建索引)。
先建父表 子表才能建外键 父表和子表必须都是innodb引擎
city父表
create table city(id tinyint primary key,name varchar(10) not null)engine=INNODB;
students 子表
create table students(id tinyint primary key auto_increment, id
定义字段时同时定义
city tinyint, 注释: 外键字段类型要与主表相同foreign key(city) references city(id), 注释:city 字段作为外键 ,引用city表中的id)engine=INNODB;
-----------------------------------------------------------------------------
主表的数据可以修改,但不能删除
图四
删除city中的记录
delete from city where id=1;
创建外键以后,再删除city记录,就会报错:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`hxsd`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`city`) REFERENCES `city` (`id`))
第三节 删除约束
删除primary key
alter table 表名 drop primary key;
删除index
alter table 表名 drop index index_name;
删除外键约束
alter table 表名 drop foreign key FK_ID;
第四节 索引与约束的关系
图五
索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引,是因为数据库认为对数据库进行唯一检查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯一索引。同样,常见的主键即是唯一性的约束,也是个索引。但对于not null 这样的约束,数据库是不会创建索引的。
第五节 分区
如果一张表的数据量太大,不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库推出了分区的功能。MySQL表分区主要有以下四种类型:
RANGE分区:
RANGE即范围分区,根据区间来判断位于哪个分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。
create table test(id int DEFAULT null,name char(30),datedata date)PARTITION BY RANGE (year(datedata)) (PARTITION part1 VALUES LESS THAN (1990) ,PARTITION part2 VALUES LESS THAN (1995) ,PARTITION part3 VALUES LESS THAN (2000) ,PARTITION part4 VALUES LESS THAN MAXVALUE );
LIST分区
图六
LIST分区类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
create table test1(id int not null,name char(30),career VARCHAR(30))PARTITION BY LIST (id) (PARTITION part0 VALUES IN (1,5) ,PARTITION part1 VALUES IN (11,15) ,PARTITION part2 VALUES IN (6,10) ,PARTITION part3 VALUES IN (16,20));
HASH分区
HASH分区基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值进行Hash计算。
CREATE TABLE employees (id INT NOT NULL,firstname VARCHAR(30),lastname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT)PARTITION BY HASH(store_id) PARTITIONS 4;
KEY分区
KEY分区类似HASH,但是HASH允许用户使用自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列。
CREATE TABLE tk (col1 INT NOT NULL,col2 CHAR(5),col3 DATE,PRIMARY KEY(col1))PARTITION BY KEY (col1) PARTITIONS 3
MySQL-视图与事务「程序员培养之路第二十六天」
MySQL-查数据「程序员培养之路第二十五天」
MySQL-基本语法「程序员培养之路第二十四天」