第一节索引
索引是帮助MySQL高效获取数据的数据结构
数据库在保存数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引可以大大提高MySQL的检索速度。
在MySQL中,对于一个PrimaryKey的列,MySQL已经自动对其建立了Unique和Index。
图一创建索引
createtable表名(idintnotnull,usernamevarchar(16)notnull,index(username(length))###用username字段作为索引);
显示索引
showindexfrom表名;
删除索引
altertable表名dropindexname;
图二第二节约束(constraint)
约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束
列级约束:针对某一字段来使用
表级约束:针对两个或两个以上的字段使用
约束类型包括:
notnull(非空约束)
primarykey(主键约束)
uniquekey(唯一约束)
default(默认约束)
foreignkey(外键约束)
唯一(unique)约束
unique约束唯一标识数据库表中的每条记录。
unique和primarykey约束均为列提供了唯一性的保证。
primarykey被自动定义为unique约束。
注意:每个表可以有多个unique约束,但是每个表只能有一个primarykey约束。
第一种方式
createtablepersons(id_pintnotnull,addressvarchar(),cityvarchar(),phonevarchar(11)unique#定义字段的同时,定义约束);
第二种方式
createtablepersons(id_pintnotnull,addressvarchar(),cityvarchar(),phonevarchar(11),uniquephone(phone)#单独一行命令,定义约束
第三种方式
altertablepersonsadduniquecity(city);修改表
默认(default)约束
用于约束对应列中的值的默认值(除非默认为空值,否则不可插入空值)
createtablepersons(idtinyintprimarykeyauto_increment,namevarchar(30),sexenum(m,w)defaultm,#定义sex默认值为:m)
图三主键(primarykey)约束
每张数据表只能存在一个主键,主键保证记录的唯一性,主键自动为notnull(同时作为表的索引)。
为没有主键的表添加主键
altertable表名addprimarykey(字段名)
外键(foreignkey)约束
外键约束是为了保持数据一致性,完整性,实现一对一或一对多关系
子表(具有外键列的表)和父表(子表所参照的表),存储引擎只能为innoDB。
外键列和参照列必须具有相似的数据类型。
– 如果是数字类型,数字的长度、是否有符号位必须相同
– 字符类型的长度则可以不同
外键列和参照列必须创建索引(如果外键列不存在索引的话,MySQL将自动创建索引)。
先建父表子表才能建外键父表和子表必须都是innodb引擎
city父表
createtablecity(idtinyintprimarykey,namevarchar(10)notnull)engine=INNODB;
students子表
createtablestudents(idtinyintprimarykeyauto_increment,id
定义字段时同时定义
citytinyint,注释:外键字段类型要与主表相同foreignkey(city)referencescity(id),注释:city字段作为外键,引用city表中的id)engine=INNODB;
-----------------------------------------------------------------------------
主表的数据可以修改,但不能删除
图四删除city中的记录
deletefromcitywhereid=1;
创建外键以后,再删除city记录,就会报错:
ERROR():Cannotdeleteorupdateaparentrow:aforeignkeyconstraintfails(`hxsd`.`students`,CONSTRAINT`students_ibfk_1`FOREIGNKEY(`city`)REFERENCES`city`(`id`))
第三节删除约束
删除primarykey
altertable表名dropprimarykey;
删除index
altertable表名dropindexindex_name;
删除外键约束
altertable表名dropforeignkeyFK_ID;
第四节索引与约束的关系
图五索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引,是因为数据库认为对数据库进行唯一检查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯一索引。同样,常见的主键即是唯一性的约束,也是个索引。但对于notnull这样的约束,数据库是不会创建索引的。
第五节分区
如果一张表的数据量太大,不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库推出了分区的功能。MySQL表分区主要有以下四种类型:
RANGE分区:
RANGE即范围分区,根据区间来判断位于哪个分区。这些区间要连续且不能相互重叠,使用VALUESLESSTHAN操作符来进行定义。
createtabletest(idintDEFAULTnull,namechar(30),datedatadate)PARTITIONBYRANGE(year(datedata))(PARTITIONpart1VALUESLESSTHAN(),PARTITIONpart2VALUESLESSTHAN(),PARTITIONpart3VALUESLESSTHAN(),PARTITIONpart4VALUESLESSTHANMAXVALUE);
LIST分区
图六LIST分区类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
createtabletest1(idintnotnull,namechar(30),careerVARCHAR(30))PARTITIONBYLIST(id)(PARTITIONpart0VALUESIN(1,5),PARTITIONpart1VALUESIN(11,15),PARTITIONpart2VALUESIN(6,10),PARTITIONpart3VALUESIN(16,20));
HASH分区
HASH分区基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值进行Hash计算。
CREATETABLEemployees(idINTNOTNULL,firstnameVARCHAR(30),lastnameVARCHAR(30),hiredDATENOTNULLDEFAULT-01-01,separatedDATENOTNULLDEFAULT-12-31,job_codeINT,store_idINT)PARTITIONBYHASH(store_id)PARTITIONS4;
KEY分区
KEY分区类似HASH,但是HASH允许用户使用自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列。
CREATETABLEtk(col1INTNOTNULL,col2CHAR(5),col3DATE,PRIMARYKEY(col1))PARTITIONBYKEY(col1)PARTITIONS3
MySQL-视图与事务「程序员培养之路第二十六天」
MySQL-查数据「程序员培养之路第二十五天」
MySQL-基本语法「程序员培养之路第二十四天」