一.什么是索引

官方定义:一种帮助mysql提高查询效率的一种数据结构,通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度,一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的。

索引的优点

  • 大大加快了查询速度
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  • 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多

索引的缺点

  • 增删改的时候由于多了索引,速率会下降
  • 会占用磁盘空间
  • 维护索引需要消耗数据库数据

二. 索引的分类

Innodb

  • 主键索引
    设定为主键后数据库会自动建立索引,innodb为聚簇索引,主键索引不可为null
  • 唯一索引
    索引列的值必须唯一,但可以有空值
  • 普通索引
    一个索引值包含单个列,一个表可以有多个单利索引
  • 复合索引
    即一个索引包含多个列

MISAM

  • Full Text 全文索引

全文索引类型为Full Text,在定义索引的列上支持值的全文索引,运行在这些索引里面插入重复值和空值,全文索引可以才char,varchar,text类型上创建,mysql只有 myisam上可以创建

三.如何创建索引

主键索引

创建表的时候:

create table user (id int(10) PRIMARY KEY,name varchar(10))

创建表之后:

主键索引创建后就存在

普通索引

创建表的时候:

create table user1 (id int(10) primary key ,name varchar(10),key(name))

创建表之后:

create index name_index on user1

查看索引:

SHOW INDEX FROM USER1

唯一索引

创建表的时候:

create table user2 (id int(10) primary key,name varchar(20),age int(10) unique(name))

创建表之后:

create unique index age_index on user2(age)

查看索引:

show index from user2

复合索引:

创建表之前:

CREATE TABLE user3 (id INT(10) PRIMARY KEY,NAME VARCHAR(10),age INT(10),KEY(NAME,age))

创建表之后:

create index nameageindex on user3(name,age)

查看索引:

show index from user3

三.最左前缀原则:

当复合索引的顺序是name ,age,bir的时候,按照下面字段的顺序查询,是否可以利用索引

  • name age bir:可以
  • name bir age:可以
  • bir name age:不可
  • age bir name:不可
  • name bir:可以
  • name age:可以
  • bir name:不可
  • bir age:不可
  • age bir:不可

当我们按照复合索引字段的顺序查找时,那么就可以利用索引,但是mysql会动态的调整字段的顺序,只要第一个字段存在查询语句里面,就可以

四.索引的数据结构

当我们给一个表插入一些数据的时候,如果写的顺序不一样,那么会是怎么样的呢?答案是会按照索引自动排序,这是为什么呢?

create table emp(id int(10) primary key,name varchar(20),age int(10))insert into emp value(4,'d',22)
insert into emp value(1,'a',12)
insert into emp value(3,'c',32)
insert into emp value(2,'b',72)
insert into emp value(5,'e',22)

索引的原理

为什么上面数据明明没有按顺序插入,为什么查询时却是有顺序呢?