索引类型与索引方式

一、索引类型

mysql常用索引分为:普通索引、唯一索引、主键索引、组合索引、全文索引

1、普通索引

  • 关键字:Normal
  • 普通索引是最基本的索引类型,唯一的任务是加快对数据的访问速度,没有任何限制。
  • 默认会使用btree。
//1、 直接创建索引
create index index_name on table(column(length));
// 常规创建
create index index_name on user(name);
// 针对字符串的前几个字符进行创建索引,节省空间,减少比较时间、解决排序问题
create index index_name on user(name(5));

//2、修改表结构的方式新增索引
alter table table_name add index index_name(column(length));
// 常规创建
alter table user add index index_name(name);
//对字符串的前几个字符进行创建索引
alter table user add index index_name(name(10));

// 3、创建表的时候同时创建索引
CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `name` char(20) CHARACTER NOT NULL ,
    PRIMARY KEY (`id`),
    INDEX index_name (name(length))
)

// 4、删除索引
drop index index_name on table;

2、唯一索引

关键字:Unique
索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

//1、 创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
// 常规创建
create unique index index_name on user(name);

//2、修改表结构
ALTER TABLE table_name ADD UNIQUE indexName(column(length))
// 常规创建
alter table user add unique index index_name(name);

// 3、创建表的时候直接指定
CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `name` char(20) CHARACTER NOT NULL ,
    PRIMARY KEY (`id`),
    UNIQUE INDEX index_name (name(length))
)

3、主键索引

是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) NOT NULL ,
    PRIMARY KEY (`id`)
);

4、组合索引

指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);

5、全文索引

  • 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
  • fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的- where语句的参数匹配。
  • fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用。
  • 目前只有char、varchar,text 列上可以创建全文索引。
  • 在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
// 创建表的适合添加全文索引
CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `content` text CHARACTER NULL ,
    PRIMARY KEY (`id`),
    FULLTEXT (content)
);

// 修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)

// 直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)

二、索引方式

mysql索引方式分为:BTREE和HASH。

1、BTREE

  • 可理解为”排好序的快速查找结构”
  • 每个叶子节点到根节点距离相等
  • 所有被索引的列都是排过序的
  • 适合范围查找、支持数据排序

2、HASH

  • 理论查询时间复杂度为O(1)
  • 在磁盘随机存放数据
  • 仅支持”=”,”IN”和”<=>”精确查询,不能使用范围查询
  • 不支持排序
  • 无法进行前缀索引
  • 在任何时候都不能避免表扫描
  • 检索效率高,索引的检索可以一次定位
  • 只有Memory引擎支持显式的Hash索引
  • 必须回行,通过索引拿到数据位置,必须回到表中取数据