面试题:mysql索引有哪几种?
答:
索引有两类,一是单列索引,二是组合索引。
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
按照特性区分:
1、普通索引;
这是最基本的索引,它没有任何限制。
2、主键索引
被指定为主键的列,也自动被创建为索引,这个“索引”称作主键索引。不能插入NULL值,并且每条数值唯一。
3、唯一索引
唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许插入null 值或者多个null 值。如果是组合索引,则列值的组合必须唯一。
自己去验证(主键索引)
1 分别创建表 tableone、 tabletwo。
表tableone,不设置主键。
表tabletwo, 设置一个主键。
CREATE TABLE tableone(
oid int,
oname VARCHAR(10),
oage int,
osex VARCHAR(10)
);
CREATE TABLE tabletwo(
tid int PRIMARY KEY,
tname VARCHAR(10),
tage int,
tsex VARCHAR(10)
);
2 查询两张表的索引信息
猜测:
字段oid, 我没有设置为主键id, 故查询的结果是: 应该是一条索引信息都没有。
SHOW INDEX FROM tableone;
SHOW INDEX FROM tabletwo;
- sql执行结果:结果1: 为null(空)。
- 结果2:有一条索引信息(Key_name:PRIMARY), 这条索引就是在建表时,自动创建的主键索引。
3 猜测正确
- 结果:猜测正确。
4 下结论:
通过两张表的创建,得出结论。在创建表tabletwo 的时候, 把tid设置成主键id的同时,也自动把tid创建成了索引,这个索引叫作主键索引。
被设置成主键索引的列,不能插入NULL值,并且每条数值唯一。
唯一索引(自己去验证)
语法
CREATE UNIQUE INDEX student_index_score ON student(score);
1 建表 tablethree
CREATE TABLE tablethree(
tid int PRIMARY KEY,
tname VARCHAR(10),
tage int,
tsex VARCHAR(10)
);
2 查询表tablethree 中索引信息
SHOW INDEX FROM tablethree;
结果: 空
2 把tsex列 设置成唯一索引列。
SQL:
CREATE UNIQUE INDEX tablethree_index_tsex ON tablethree(tsex);
3 再查询表tablethree 中索引信息
结果: 有
4 测试:
-- 在tsex索引列上,插入null值
INSERT INTO tablethree(tid,tname,tage) VALUE(2,'高启强',40);
INSERT INTO tablethree(tid,tname,tage) VALUE(3,'老墨啊',42);
插入两条数据,tsex列上值为null,插入成功。
证明了:在唯一索引上可以插入null值,甚至多条。
-- 在tsex索引上,插入重复值‘女’
INSERT INTO tablethree(tid,tname,tsex) VALUE(5,'安欣','女')
[Err] 1062 - Duplicate entry ‘女’ for key ‘tablethree_index_tsex’
被设置成了唯一索引的列,不允许插入重复的值,否则会报错提示。
小结:
1.唯一索引 允许索引列上有null数据或者null 数据。
2.唯一索引 每条数据值唯一。