概述
SQL字段六大约束
约束类型 | 含义 | 备注 |
---|---|---|
Not Null | 非空 | |
Primary Key | 主键 | 保证值的唯一性,且非空 |
Foreign Key | 外键 | 用于限制两个表之间的关系 |
Unique | 唯一 | 保证值的唯一性,可以为空 |
Default | 默认 | 指定字段的默认值 |
Check | 检查 | 保证必须是满足条件的值 |
1、 外键说明
保证从表的值必须来自主表的某一列的值,需在从表中添加外键
主表、从表对应的字段类型要一致或兼容
主表的字段必须是一个key(一般是主键且唯一)
插入数据时,必须先插入主表再插入从表
2、主键与唯一的区别:
主键具有唯一性,不允许为null,一张表最多一个,可以组合使用(即多个字段组合为一个主键,不推荐)
唯一具有唯一性,不允许为null,在mysql5.7中默认可以有多个null,一张表可以有多个,也可以组合使用,同样不推荐
3、表示列(自增长列)
标识列用Auto_Increment设置
标识列必须是主键或唯一 一个表中最多一个标识列
索引分四类:
索引常见四种类型
1.普通索引 index
是最基本的索引,数据可以重复,它没有任何限制。它有以下几种创建方式:
第一种:index unique scan
索引唯一扫描,当可以优化器发现某个查询条件可以利用到主键、唯一键、具有外键约束的列,或者只是访问其中某行索引所在的数据的时候,优化器会选择这种扫描类型。
1)直接创建索引
CREATE INDEX index_name ON table(column(length))
2)修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
3)创建表的时候同时创建索引
CREATE TABLE table (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) CHARACTER NOT NULL ,
content text CHARACTER NULL ,
time int(10) NULL DEFAULT NULL ,
PRIMARY KEY (id),
INDEX index_name (title(length))
)
###4)删除索引
DROP INDEX index_name ON table
2.唯一索引 unique
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
1)创建唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))
2)修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
3)创建表的时候直接指定
CREATE TABLE table (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) CHARACTER NOT NULL ,
content text CHARACTER NULL ,
time int(10) NULL DEFAULT NULL ,
UNIQUE indexName (title(length))
);
3.主键索引 primary key
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引
CREATE TABLE table (
id int(11) NOT NULL AUTO_INCREMENT ,SQL
title char(255) NOT NULL ,
PRIMARY KEY (id)
);
4.组合索引
单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引:即一个索包含多个列。
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合
ALTER TABLE table ADD INDEX name_city_age (name,city,age);
5.全文索引 fulltext
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。
fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table、alter table、create index使用,不过目前只有char、varchar、text列上可以创建全文索引。
在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
1)创建表的适合添加全文索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
2)修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)
3)直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)
创建索引
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.CREATE TABLE
2.ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
3.CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
#删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。
查看索引
mysql> show index from tblname;
mysql> show keys from tblname;
索引的缺点
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
索引注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
这将导致索引失效而进行全表扫描,例如
SELECT * FROM table_name WHERE YEAR(column_name)<2017;
6.不使用not in和<>操作
unique ----唯一索引,唯一索引,要求所有记录都唯一
primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键
第二种:index range scan
索引范围扫描,当优化器发现在UNIQUE列上使用了大于、小于、大于等于、小于等于以及BETWEEN等就会使用范围扫描,在组合列上只使用部分进行查询,导致查询出多行数据。对非唯一的索引列上进行任何活动都会使用index range scan。
第三种:index full scan
全索引扫描,如果要查询的数据可以全部从索引中获取,则使用全索引扫描。
fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。
第四种:index fast full scan
索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。“在这种存取方法中,可以使用多块读功能,也可以使用并行读入,从而得到最大的吞吐量和缩短执行时间”。
最后
以上就是饱满豆芽为你收集整理的SQL字段六大约束、索引SQL字段六大约束索引常见四种类型查看索引索引的缺点索引注意事项的全部内容,希望文章能够帮你解决SQL字段六大约束、索引SQL字段六大约束索引常见四种类型查看索引索引的缺点索引注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复