首页 > 代码库 > mysql重点--索引

mysql重点--索引

1.关于索引

# 什么是索引

索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。

#索引的作用

加速查询和约束。

# 为什么索引查询会变快

没创建一个索引会相应的创建一个索引表。索引表是由相应的数据和B-tree数字组成:

                30

 
        10                        40
 
   5         15            35             66
 
1   6     11    19      21      39     55     100
观察数据结构可知,每一个数字的左下比他小右下比他大。

上述的数字结构就是B-tree数字组成的索引目录,相应的每一个数字代表一个索引目标。若是索引列有1024个数据,

那么会生成10层这样的数据。也就是在找寻每一个索引目标平均为10次。而没有创建索引的列在寻找的时候要遍历

整个数据结构,即最多1024次。提升的速率可想而知。

2.索引类型

  • 普通索引
  • 唯一索引
  • 主键索引
  • 组合索引
  • =========分割===========
  • 覆盖索引
  • 全文索引
  • 索引合并

普通索引 index

  功能:加速查找 

  条件:无(可以为空,可以重复)

  创建方法:

    1.创建table时创建

    create table in1(

      nid int not null auto_increment primary key,

      name varchar(32) not null,

      email varchar(64) not null,

      extra text,

      index ix_name (name) )
    其中ix_name 为索引的名字

    2.table创建好后添加(必须符合索引条件)

  create index index_name on table_name(column_name)

唯一索引 unique

  功能:加速查找 

  条件:不能重复,可以是null。

  创建方法:

    1.创建table时创建

    create table in1(

      nid int not null auto_increment primary key,

      name varchar(32) not null,

      email varchar(64) not null,

      extra text,

      unique ix_name (name) )
    其中ix_name 为索引的名字

    2.table创建好后添加(必须符合索引条件)

    create unique index index_name on table_name(column_name);

主键索引 primary key

  主键是特殊的索引,在创建主键的同时已经创建好了索引表。

  功能:加速查找 

  条件:不能重复,不能null。

  创建方法:

    1.创建table时创建

    create table in1(

      nid int not null auto_increment primary key,

      name varchar(32) not null,

      email varchar(64) not null,

       )

    or

    create table in1(

      nid int not null auto_increment ,

      name varchar(32) not null,

      email varchar(64) not null,

      primary key(nid)

       )

    2.table创建好后添加(必须符合索引条件)

    alter table table_name add primary key(nid);

  删除主键

    alter table 表名 drop primary key;

    alter table 表名 modify 列名 int, drop primary key;

组合索引

  组合索引又叫联合(普通,唯一)索引。其实就是创建索引时变为多列。

  功能:加速查找 

  条件:根据创建形式

  创建方法:

    1.创建table时创建

    create table in1(

      nid int not null auto_increment primary key,

      name varchar(32) not null,

      email varchar(64) not null,

      extra text,

      unique ix_name (name,nid) )   # 联合唯一索引,也别的是两列的唯一指的是合起来的唯一。

      (“ccc”,3)和(“ccc”,4)可以存在。
    其中ix_name 为索引的名字

    2.table创建好后添加(必须符合索引条件)

    create unique index index_name on table_name(column_name);

  注意:

    组合索引遵循最左匹配。即(nid,name,addr)在这个组合索引中,若是有

    select * from table_name where name = "fff" and addr = "seatle"

    这样的语句中不会走索引。而nid和 addr会走索引。

删除办法 (除主键)

drop index_name on table_name;

查看查询

show index from table_name;

注意

列的类型为 blob和text时必须指定长度。两者太长没必要。

create index ix_extra on in1(extra(32));

=====================分割(都是概念)=======================

覆盖索引

  覆盖索引时一种概念,指的是在索引时没有进行第二步在数据表中取数据,直接在索引表中取到了。

  如 select nid from table_name where nid >10;

  由于nid就是主键或者索引,并且取的数据都是索引的值。那程序只要将B-tree的值转化成数据就成。没有第二步步骤。

索引合并

  索引合并是在索引过程中,运用到了两列以上作为条件限制。区别于组合索引。

  select * from table_name where nid = 23 and name = "ccc";

  nid是主键,name是普通索引。这样的索引形式成为索引合并。

  那么组合的仍有最左前缀的限制,为什么还存在组合索引?

  因为,有种情况是组合索引的最左是根。比如用户名和密码,没有人会脱离用户名去索引密码。

  并且,组合索引在这种索引多列的情况下优于索引合并的速率

其他

  条件语句

  delimiter \

    CREATE PROCEDURE proc_if ()

    BEGIN

    declare i int default 0;

    if i = 1 THEN SELECT 1;

    ELSEIF i = 2 THEN SELECT 2;

    ELSE SELECT 7;

    END IF;

    END\

  delimiter ;

循环语句

 

动态执行SQL语句 

# 将传送过来的数据输入某些sql语句中。

技术分享 动态执行SQL

mysql重点--索引