我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行数据。
现在假设我们要从这个表中查找出所有名字是‘Jesus’的雇员信息。我们决定使用下面的查询语句:
SELECT * FROM Employee
WHERE Employee_Name = 'Jesus'
一旦我们运行这个查询,在查找名字为Jesus的雇员的过程中,究竟会发生什么?数据库不得不Employee表中的每一行并确定雇员的名字(Employee_Name)是否为 ‘Jesus’。由于我们想要得到每一个名字为Jesus的雇员信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。所以,必须一行一行的查找直到最后一行-这就意味数据库不得不检查上千行数据才能找到所以名字为Jesus的雇员。这就是所谓的全表扫描。
如何在使用SQL创建索引:
之前的例子中,在Employee_Name列上创建索引的SQL如下:
CREATE INDEX name_index
ON Employee (Employee_Name)
如何创建联合索引
我们可以在雇员表上创建两个列的联合索引,SQL如下:
CREATE INDEX name_index
ON Employee (Employee_Name, Employee_Age)
主键索引
主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。
比如 :
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键
在MySQL中,InnoDB数据表的主键设计我们通常遵循几个原则:
1、采用一个没有业务用途的自增属性列作为主键;
2、主键字段值总是不更新,只有新增或者删除两种操作;
3、不选择会动态更新的类型,比如当前时间戳等。
创建表的时候同时为表创建主键索引和普通索引:例子如下
创建表的时候同时为表创建主键索引和普通索引:例子如下
mysql> create table student(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default'0',
dept varchar(16) default null,
primary key(id),
key index_name(name) );
Query OK, 0 rows affected (0.00 sec)
注意:
primary key(id) <-主键
KEY index_name(name) <-name字段普通索引
只有int类型且为primary key才可以使用auto_increment
注意:
primary key(id) <-主键
KEY index_name(name) <-name字段普通索引
只有int类型且为primary key才可以使用auto_increment