索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的MySQL索引,或优化查询语句。但瑕不掩瑜,索引提供了巨大性能提升,因而广泛被使用在MySQL服务器之上。
索引分为四类:
普通索引:这是最基本的索引类型,没唯一性之类的限制。
唯一性索引:和普通索引基本相同,但所有的索引列只能出现一次,保持唯一性。
主键:主键是一种唯一索引,但必须指定为”PRIMARY KEY”。
全文索引:MYSQL从3.23.23开始支持全文索引和全文检索。在MYSQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。
建立一个简单的索引,为DepartmentID和Address这两列:
CREATE INDEX aaa ON Employees(DepartmentID, Address);
建立唯一性索引:
CREATE UNIQUE INDEX Dep_ind on Departments(DepartmentName);
每一个索引可以包含多个列,但每一列都必须在同一个表中,因为每一个索引都是在同一个表之上。
查看表中有多少个索引:
SHOW INDEX FROM Employees;
向表中添加索引,可以使用ALTER TABLE语句:
ALTER TABLE Employees ADD UNIQUE INDEX date_ind(Birthday), ADD INDEX na_ind(Name, Sex);
假设表中没有主键,可以ALTER TABLE把某一列设置为主键:
ALTER TABLE Employees ADD PRIMARY KEY(DepartmentID);
DROP INDEX depart_ind ON Employees;
也可以使用ALTER TABLE语句,同时也可以把主键移除了:
ALTER TABLE Department DROP PRIMARY KEY, DROP INDEX Dep_ind;
MySQL提供了四种约束方式:主键约束、替代键约束、参照完整性约束和CHECK完整性约束。所有约束都可以在建立表的时候同时建立。
在主键约束中的列不能去空值。每一个表中只有一个主键约束。MySQL会为主键列创建唯一性索引,实现数据的唯一性。查询时因为有索引,所能能够快速查询主键。主键的关键字为PRIMARY KEY。
替代键像主键一样,是表的一列或一组的列,他们的值在任何时候都是唯一的。替代键是没有被选做主键的候选键,定义替代键的关键字是UNIQUE。
两者间的区别:1. 一个表只能创建一个主键;而替代键可以是若干个,并且它们可以是重合的。2. 主键的字段不可以为NULL;替代键允许NULL值,但必须使用NULL或者NOT NULL的声明。3. 创建主键约束的时候系统自动产生PRIMARY KEYS索引;创建替代键约束的时候系统自动产生UNIQUE索引。
CREATE TABLE Employees3
(
EmployeeID CHAR(6) NOT NULL,
Name CHAR(10) NOT NULL PRIMARY KEY,
Sex TINYINT(1),
Education CHAR(4),
UNIQUE(EmployeeID)
);
参照完整性是数据库设计中一个重要的概念。在系统不同的列表中,当数据库所有参照合法或非合法关联时都会涉及到参照完整性。当参照完整性存在 时,任何与不存在记录的关联将变得无效化,由此可防止用户出现各种错误,从而提供更为准确和实用的数据库。参照完整性通常通过外键的使用而被广泛应用。MySQL的InnoDB支持外键,因此参与参照完整性约束的每一个表都必须使用InnoDB引擎。
CREATE TABLE Salary1
(
EmployeeID CHAR(6) NOT NULL PRIMARY KEY,
InCome FLOAT(8) NOT NULL,
OutCome FLOAT(8) NOT NULL,
FOREIGN KEY (EmployeeID)
REFERENCES Salary(EmployeeID)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CHECK完整性约束实质就是在建立表的时候添加条件,当录入的字段无法符合条件的时候,MySQL就会禁止这些字段插入到表中。
CREATE TABLE student
(
学号 CHAR(6) NOT NULL,
性别 CHAR(1) NOT NULL,
CHECK(性别 IN(‘男’,'女’))
);
