什么是索引:
索引是一个“内置表”,该表的数据是对某个真实表的某个(些)字段的数据做了“排序”之后的存储形式。
其作用是:极大提高表查找数据的速度!——其效率(速度)可以匹敌二分查找。
注意:索引在提供查找速度的同时,降低增删改的速度。
对创建(设计)表来说,建立索引是非常简单的事,形式如下:
索引类型 (字段名1,字段名2, .... ) //可以使用多个字段建立索引,但通常是一个
有以下几种索引:
普通索引:key(字段名1,字段名2, .... ):它只具有索引的基本功能——提速
唯一索引:unique key (字段名1,字段名2, .... )
主键索引:primary key (字段名1,字段名2, .... )
全文索引:fulltext (字段名1,字段名2, .... )
说明:普通索引和唯一索引可以为索引命名,比如 unique key 名字 (字段名1,字段名2, .... )
普通索引:没有特定其他作用,就只是建立索引,提高查询速度。设定形式:index|key [索引名] (字段名1[,字段名2,...])。
一个普通索引只有一个字段,我们称为单列索引;一个普通索引有两个及以上字段,我们又称为组合索引。
第4、5行是单列索引,第6行是组合索引。单列索引和组合索引在使用上还是有很大区别的,等到第十章会做详细介绍。
唯一索引:设定某字段为唯一,且建立索引。设定形式: unique [key] [索引名] (字段名1[,字段名2,...])。
主键索引:设定某字段为主键,且建立索引。设定形式:primary key [索引名] (字段名1[,字段名2,...])。主键索引是唯一索引的特例,也是唯一索引的“加强”,主键索引本身就包含了“唯一性”,同时主键索引的字段不能为空值(null)。有时候需要用多个字段来确定主键,此时称为“联合主键”。联合主键的意思是多个(2个以上)的字段合在一起才算主键设定。
比如某个学生管理系统中有个“成绩表”,记录了一个学生整个大学所有所学课程的考试成绩。则该表中至少要记录3项信息:学生ID,课程名称,成绩。且此时我们要查到一个成绩,必须确定学生ID和课程名,才可能确定该成绩。我们不能说该学生成绩是多少,也不能说某门课成绩是多少,而必须说某个学生的某门课成绩是多少。此时,学生ID和课程名称合起来才能确定一个有意义的数据,这个字段就构成“主键”。如图所示:
不建议设计联合主键的,最好每个表都用“id”作为主键。
如果没有主键,则可能会造成数据的冲突或歧义,比如:工资表,如果没有主键,同名时就无法区分谁的工资是多少。成绩表,如果没有主键,则可能出现某个人的某门课有多个成绩数据。
全文索引:设定某字段可进行全文查找。 设定形式: fulltext [index][索引名] (字段名1[,字段名2,...])。
楠神写设计表时没用过全文索引,它对中文不起作用,所以楠神也一直没去研究它。
中文与西方文字如英文的一个重要区别在于,西方文字以单词为单位,单词与单词之间以空格分隔。而中文以字为单位,词由一个或多个字组成,词与词之间没有空格分隔。当试图在一个含有中文字符的字段中使用全文搜索时,不会得到正确的结果,原因在于中文中没有像英文空格那样对词定界,不能以空格作为分割,(于是不方便)对中文词语进行索引。
如果大家想去研究中文的全文索引,可去搜索“sphinx插件”。
什么叫约束:约束就是一种限定数据以符合某种要求的形式(机制),约束就是对表中数据的某种限制。当然此限制是我们人为加上去的为了使我们的数据更具有“合理性”和“安全性”。数据的最基本约束是“数据类型”,比如保存工资的字段,就不应该存入字符串值(这一点来说,excel表格就做不到),此时设定其数据类型就解决了此问题。但我们这里说的约束,是在现有已经设定好数据类型基础上的进一步“要求”,比如,一个学校的学生学号,有一个要求就是“不能重号”,则我们可以给该字段设定“唯一性”约束它,这就是唯一约束。mysql有如下几项约束:
主键约束:primary key (字段名1,字段名2, .... )
其实就是主键索引,也是主键属性。即primary key有3个角度的理解(说法):字段属性设置为主键,或建立的主键索引,或设定一个主键约束,但他们的本质是一样。
唯一约束:unique key (字段名1,字段名2, .... ),其实也是“3体合一”(类似primary key)
外键约束:
什么叫外键:就是设定一个表中的某个字段的值,必须“来源于”另一个表的某个主键字段的值。
语法形式:
foreign key (字段名1,字段名2, .... ) references 表名2(字段名1,字段名2, .... )
说明:
对某个(些)字段设定外键,则其相对应的其他表的对应字段需要设置为主键。
楠神在设计数据表时从没有用过外键约束,我们学MySQL最终是要用PHP脚本来发送SQL语句指令的,PHP可以保持两张表的主从关系,不需要MySQL再浪费资源去做检查验证,它会影响数据的插入速度。
结论是:外键不是必须的,盲目地设置外键会给系统的运行带来麻烦。做外键也有好处,除了起约束作用,还可以帮助其他人理解你的数据库结构。依个人习惯去选择吧。
非空约束:就是要求该字段的值不能为空,其只能在字段上当作字段属性来设定。
默认约束:就是要求该字段的值在“空”的时候会自动填充该设定的默认值,也只能字段上设定。
检查约束:就是使用一个表达式(逻辑判断)来决定数据是否有效,比如年龄字段,可以使用
tinyint,则可能会超过127就不合适了。
tinynit unsigned,则0-255是可以的。
但:如果考虑现实情况,假设某保险公司只作150岁以下的人的保险。则我们就可以继续对该字段可能存储的数据进行“约束”。比如类似:if(age > 150){return false}
可惜的是:mysql不支持检查约束的语法和功能。