例如我们现在有表employee
mysql> CREAT TABLE employee(eid INT PRIMARY KEY,
fname VARCHAR(20),
lname VARCHAR(20),
fname_pinyin(40),
lname_pinyin(40),
depart VARCHAR(40),
birth DATE,
sex CHAR(1));
- 未建索引时,当你select时,会进行全表扫描(全件检索)效率很低,创建索引和删除索引,查看本表所有索引的语句如下:
mysql> CREAT INDEX index_name on tablename(columnname);
mysql> DROP index_name;
mysql> SHOW INDEX;
- 索引分为clustered index 和 non-clustered index
一个表仅能有一个clustered index ,在mysql下一般默认会将primary key 设置为clustered index
如果不想让primary key 成为clustered index 则可以在建表的时候对主键列的描述改为: eid INT PRIMARY KEY NONCLUSTERED
- 在多个列上一起建的索引为复合索引
mysql> CREAT INDEX idx_fuhe on employee(lname_pinyin,fname_pinyin);
- 在创建索引时加了UNIQUE就是唯一性索引。
mysql> CREAT UNIQUE INDEX idx_uni on employee(fname_pinyin)
对索引的唯一性限制就是对该列数据的唯一性限制,当再有新的数据插入,此新数据的该字段和表中已有记录的该字段相同,则插入操作会报错。
当表中已有重复的数据,则创建唯一性索引会失败
复合索引也可是唯一性索引,此时只需这几个字段的组合不出现重复项即可
- 可以使用EXPLAIN 来看看SELECT语句使用索引的情况,尤其注意输出结果中rows的变化,以便来检查所建索引是否合适
mysql> EXPLAIN SELECT * FROM employee WHERE lname=“wy”