索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。索引是一种特殊的文件,它们包含着对数据表里所有记录的位置信息。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。MySQL 索引的建立对于MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度。
索引的作用
索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高性能(查询速度)。
索引优点:
索引缺点
什么时候需要创建索引
什么时候不需要创建索引
MySQL中的索引类型
普通索引:
最基本的索引,它没有任何限制。
唯一索引:
索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一。
主键索引:
特殊的索引,唯一的标识一条记录,不能为空,一般用primary key来约束。
联合索引:
在多个字段上建立索引,能够加速查询到速度。
是最基本的索引,它没有任何限制。在创建索引时,可以指定索引长度。length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度,如果是 BLOB 和 TEXT 类型,必须指定 length。
创建索引时需要注意:
如果指定单列索引长度,length 必须小于这个字段所允许的最大字符个数。
SHOW INDEX FROM tableName;
CREATE INDEX indexName ON table(columnName(length));
示例:
为 emp3 表中的 name 创建一个索引,索引名为 emp3_name_index;
create index emp3_name_index ON emp3(name);
ALTER TABLE tablename ADD INDEX index_name (columnName(length));
示例:
修改 emp3 表,为 addrees 列添加索引,索引名为 emp3_address_index;
alter table emp3 add index emp3_address_index(address);
CREATE TABLE table (
COLUMNName TYPE ,
PRIMARY KEY (id),
INDEX index_name (column(length))
);
示例:
创建 emp4 表,包含 emp_id,name,address 列, 同时为 name 列创建索引 ,索引名为 emp4_name_index。
create table emp4(emp_id int primary key auto_increment,name varchar(30),address varchar(50),index emp4_name_index(name));
DROP INDEX indexname ON tablename;
示例:
删除 mep3 表中索引名为 emp3_address_index 的索引。
drop index emp3_address_index on emp3;
唯一索引与普通索引类似,不同的就是: 索引列的值必须唯一,但允许有空值。
CREATE UNIQUE INDEX indexName ON table(column(length));
示例:
为 emp 表中的 name 创建一个唯一索引,索引名为 emp_name_index。
create unique index emp_name_index on emp(name);
ALTER TABLE table_name ADD UNIQUE indexName (column(length));
示例:
修改 emp 表,为 salary 列添加唯一索引,索引名为 emp_salary_index。
alter table emp add unique emp_salary_index(salary);
CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY (`id`),
UNIQUE index_name (column(length))
);
示例:
创建 emp5 表,包含 emp_id,name,address 列,同时为 name 列创建唯一索引。索引名为 emp5_name_index。
create table emp5(emp_id int primary key ,name varchar(30),address varchar(30),unique emp5_name_index(name));
主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
示例:
修改 emp 表为 employee_id 添加主键索引。
alter table emp add primary key(employee_id);
CREATE TABLE `table` (
COLUMN TYPE ,
PRIMARY KEY(column)
);
示例:
创建 emp6 表,包含 emp_id,name,address 列,同时为 emp_id 列创建主键索引。
create table emp6(employee_id int primary key auto_increment,name varchar(20),address varchar(50));
组合索引是指使用多个字段创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则)。
就是最左优先。
如: 我们使用表中的 name ,address ,salary 创建组合索引,那么想要组合索引生效, 我们只能使用如下组合:
name/address/salary
name/address
name/
如果使用 addrees/salary 或者是 salary 则索引不会生效。
ALTER TABLE tablename ADD INDEX index_name (column(length),column(length));
示例:
修改 emp6 表,为 name ,address 列创建组合索引。
alter table emp6 add index emp6_index_n_a(name,address);
CREATE TABLE `table` (
COLUMN TYPE ,
INDEX index_name (column(length),column(length))
);
示例:
创建 emp7 表,包含 emp_id,name,address 列,同时为 name,address 列创建组合索引。
create table emp7(emp_id int primary key auto_increment ,name varchar(20),address varchar(30),index emp7_index_n_a(name,address));