索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。
MySQL中,所有的数据类型都可以被索引。MySQL的索引有的普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
索引可以提高查询的速度,但是会影响插入记录的速度。因为向有索引的表中插入记录时,数据库系统会按照索引进行排序。
这样就降低了插入记录的速度,插入大量记录时的速度影响更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据。插入完成后,再创建索引。
索引的分类
1、普通索引
不加任何限制条件
2、唯一性索引
使用UNIQUE参数
3、全文索引
使用FULLTEXT参数,只能创建在CHAR,VARCHAR,TEXT类型的字段上,只有MyISAM存储引擎支持全文索引。
4、单列索引
在一个字段上建立的普通索引,唯一性索引或全文索引
5、多列索引
在多个字段上建立的普通索引,唯一性索引或全文索引
6、空间索引
使用SPATIAL参数,只有MyISAM存储引擎支持空间索引,必须建立在空间数据类型上,且必须非空,初学者很少用到。
索引的设计原则
1、选择唯一性索引
2、为经常需要排序、分组和联合操作的字段建立索引
如ORDER BY、GROUP BY、DISTINCT,UNION等操作的字段,特别是排序
3、为常作为查询条件的字段建立索引
4、限制索引的数目
避免过多地浪费空间
5、尽量使用数据量少的索引
6、尽量使用前缀来索引
如指索引TEXT类型字段的前N个字符
7、删除不再使用或者很少使用的索引。
创建索引
创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。
创建索引有3种方式,这3种方式分别是
- 创建表的时候创建索引
CREATE TABLE 表名 (属性名 数据类型 [完整约束条件],[UNIQUE|FULLTEXT|SPATIALINDEX|KEY [别名] (属性名1 [(长度)] [ASC|DESC]));
//创建普通索引
CREATE TABLE index1 (id INT, name VARCHAR(20), sex BOOLEAN, INDEX(id) );
//创建唯一性索引
CREATE TABLEindex2(id INT UNIQUE, name VARCHAR(20), UNIQUE INDEX index2_id(id ASC));
//创建全文索引
CREATE TABLEindex3 (id INT, info VARCHAR(20), FULLTEXT INDEX index3_info(info)) ENGINE=MyISAM;
//创建单列索引
CREATE TABLEindex4 (id INT, subject VARCHAR(30), INDEX index4_st(subject(10)));
//创建多列索引
CREATE TABLEindex5 (id INT, name VARCHAR(20), sex CHAR(4), INDEX index5_ns(name,sex));
//使用了第一个字段才会触发索引
//创建空间索引
CREATE TABLEindex6 (id INT, Space GEOMETRY NOT NULL, SPATIAL INDEX index6_sp(space) )ENGINE=MyISAM;
- 在已经存在的表上创建索引
//创建普通索引
CREATE INDEX index7_id on example0(id);
//创建唯一性索引
CREATE UNIQUE INDEX index_8_id ON index8(course_id);
//创建全文索引
CREATE FULLTEXT INDEX index9_info ON index9(info);
//创建单列索引
CREATE INDEX index10_addr ON index10(address(4));
//创建多列索引
CREATE INDEX index11_na ON index11(name, address);
//创建空间索引
CREATE SPATIAL INDEX index12_line on index12(line);
- 使用ALTER TABLE语句来创建索引。
ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 (属性名[(长度)][ASC|DESC]);
//创建普通索引
ALTER TABLEexample0 ADD INDEX index12_name(name(20));
//创建唯一性索引
ALTER TABLEindex14 ADD UNIQUE INDEX index14_id(course_id);
//创建全文索引
ALTER TABLEindex15 ADD INDEX index15_info(info);
//创建单列索引
ALTER TABLEindex 16 ADD INDEX index16_addr(address(4));
//创建多列索引
ALTER TABLEindex17 ADD INDEX index17_na(name, address);
//创建空间索引
ALTER TABLEindex18 ADD INDEX index18_line(line);
删除索引
DROP INDEX 索引名 ON 表名;
DROP INDEX id ONindex1;
1. MySQL中索引、主键和唯一性的区别是什么?
索引建立在一个或者几个字段上。建立了索引后,表中的数据就按照索引的一定规则排列。这样可以提高查询速度。
主键是表中数据的唯一标识。不同的记录的主键值不同。例如,身份证好比主个身份证号都可以唯一的确定一个人。在建立主键时,系统会目动建一个唯一性索引。
唯一性也是建立在表中一个或者几个字段上。其目的是为了对于不同的记求,具有唯一性的字段的值是不同的。
2.表中建立了索引以后,导入大量数据为什么会很慢?
对已经建立了索引的表中插入数据时,插入一条数据就要对该记录按索引排序。内此,导入大量数据的时候速度会很慢。
解决这种情况的办法是,在没有任何索引的情况插入数据,然后建立索引。