- CREATE TABLE dept(
- dept_id INT PRIMARY KEY AUTO_INCREMENT,
- dept_name VARCHAR(20)
- );
-
- CREATE TABLE emp(
- emp_id INT PRIMARY KEY AUTO_INCREMENT,
- emp_name VARCHAR(20) UNIQUE,
- dept_id INT,
- CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
- );
显式创建表时创建索引的话,基本语法格式如下:
- CREATE TABLE table_name [col_name data_type]
- [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC |
- DESC]
- CREATE TABLE book(
- book_id INT ,
- book_name VARCHAR(100),
- authors VARCHAR(100),
- info VARCHAR(100) ,
- comment VARCHAR(100),
- year_publication YEAR,
- INDEX(year_publication)
- );
- CREATE TABLE test1(
- id INT NOT NULL,
- name varchar(30) NOT NULL,
- UNIQUE INDEX uk_idx_id(id)
- );
- CREATE TABLE student (
- id INT(10) UNSIGNED AUTO_INCREMENT ,
- student_no VARCHAR(200),
- student_name VARCHAR(200),
- PRIMARY KEY(id)
- );
- CREATE TABLE test3(
- id INT(11) NOT NULL,
- name CHAR(30) NOT NULL,
- age INT(11) NOT NULL,
- info VARCHAR(255),
- INDEX multi_idx(id,name,age)
- );
- CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- title VARCHAR (200),
- body TEXT,
- FULLTEXT index (title, body)
- ) ENGINE = INNODB ;
-
- SELECT * FROM articles WHERE MATCH(title,body) AGAINST (‘查询字符串’);
- CREATE TABLE test5(
- geo GEOMETRY NOT NULL,
- SPATIAL INDEX spa_idx_geo(geo)
- ) ENGINE=MyISAM;
在已经存在的表中创建索引可以使用 ALTER TABLE 语句或者 CREATE INDEX 语句。
- ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
- [index_name] (col_name[length],...) [ASC | DESC]
- CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
- ON table_name (col_name[length],...) [ASC | DESC]
ALTER TABLE table_name DROP INDEX index_name;
DROP INDEX index_name ON table_name;
业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。(来源:Alibaba)说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的。
某个字段在SELECT语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。
索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要 对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立 组合索引。
对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。
需要对某个字段进行去重,使用 DISTINCT,那么对这个字段创建索引,也会提升查询效率。
这样也可以较少的建立一些索引。同时,由于"最左前缀原则",可以增加联合索引的使用率。在多个字段都要创建索引的情况下,联合索引优于单值索引。
在数据量不大的情况下,索引就发挥不出作用了,但是却消耗了空间和降低增、删、改的效率。
当数据重复度大,比如 高于 10% 的时候,也不需要对这个字段使用索引。
例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。