mysql 建立索引

MySQL 索引

内容主要摘抄自《MySQL5.7从入门到精通》html

索引是对数据库表中的一列或多列进行排序的一种数据结构,使用索引能够提升数据库中特定数据的查询速度。java

1、索引含义和特色

索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里全部记录的引用指针。mysql

mysql 中索引存储类型有两种:BTREE 和 HASH,具体和表的存储引擎相关;MyISAM 和 InnoDB 存储引擎只支持 BTREE 索引;MEMORY/HEAP 存储引擎能够支持 HASH 和 BTREE 索引。sql

2、索引分类

  1. 普通索引和惟一索引数据库

    普通索引:定义的索引列运行有空值和重复值。
    惟一索引:索引列的值必须惟一,容许有空值。数据结构

  2. 单列索引和组合索引app

    单列索引:一个索引只包含单列。
    组合索引:在表的多个字段组合上建立的索引,使用组合索引时遵循最左前缀集合,只有查询条件中使用了这些字段的左边字段,索引才会被使用。性能

  3. 全文索引测试

    全文索引类型为 FULLTEXT,在定义索引的列上支持值的全文查找,容许索引列插入重复值和空值。全文索引能够在字符或文本类型的列上建立,mysql 中只有 MyISAM 存储引擎支持全文索引。优化

  4. 空间索引

    mysql 空间数据类型有四种:GEOMETRY、POINT、LINESTRING 和 POLYGON。空间索引是对空间数据类型的字段创建的索引,建立空间索引的列必须声明为 NOT NULL。

3、索引设计原则

  1. 索引并不是越多越好

    一个表中如有大量索引,会占用磁盘空间,也会影响 insert、delete、update 等语句的性能,由于表中数据更改时,索引也会进行调整和更新。

  2. 索引中的列尽量的少

    对常常查询的字段应该建立索引,但要避免添加没必要要的字段。

  3. 对数据量小的表不要使用索引

    因为数据较少,查询的花费的时间可能比遍历索引的时间还要短,可能不会产生优化效果。

  4. 在不一样值较多的列上创建索引

    例如性别字段上只有“男”,“女”,“其余”,三个不一样值,若在性别列上创建索引,可能不但不会提升查询效率,反而会严重下降数据更新速度。

4、查询表中索引

SHOW INDEX FROM test;

通常查询结果显示的是表格形式,在查询语句后加上 \G 能够将查询结果纵向显示。

上图显示 id 为惟一索引。

5、建立索引

官网参考手册(5.7)-- CREATE INDEX Syntax

1. 建立表时建立索引

建立名为 idx_name 的普通索引,对惟一性没有限制

CREATE TABLE test2 (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  num int(11) NOT NULL DEFAULT 0,
  created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  INDEX idx_name(name(5))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INDEX idx_name(name(5))

上面语句指的是截取字段 name 前5个字符做为索引,也就是说每条记录的name字段的值的前5个字符不能出现重复,不然在使用 INSERT 时会出现 “Duplicate” 错误。

2. 使用 ALTER TABLE 语句

ALTER TABLE test2 ADD INDEX idx_name(name(5));

3. 使用 CREATE INDEX 语句

CREATE INDEX idx_name ON test2(name(5));

6、删除索引

1. 使用 ALTER TABLE 删除

ALTER TABLE test2 DROP INDEX idx_name;

2. 使用 DROP INDEX 删除

DROP INDEX idx_name ON test2;

7、索引名称规范

  • 普通索引

    "idx_" 前缀加上字段名称,eg: idx_name

  • 惟一索引

    "uniq_"前缀加上字段名称,eg: uniq_name

MySQL命名、设计及使用规范

8、索引长度限制

长度不超过767bytes,联合索引长度不超过3072bytes。

于InnoDB索引长度限制的tips
mysql innodb存储与索引的总结

9、什么状况适合建索引?

索引使用经验:什么状况适合建索引

10、小测试

建立一个表,字段以下:

批量插入80万条数据,name长度为30字符左右

建立索引花了3秒多,建立索引后同一条查询语句,执行时间加快的差很少770倍,对比仍是很明显的

相关文章
相关标签/搜索