索引的含义和特点:

索引是单独的丶储存在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针.用于提高数据库查询速度.

myqsl:支持btree和hash               注意:myisam和innodb只支持btree索引
索引的含义
四个优点

1.通过创建唯一索引,可以保证数据库表中每一行数据的唯一性

2.可以大大加快数据查询速度,这是创建索引主要原因

3.在实现数据的参考完整性方面,可以加速表和表之间的连接

4.使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序时间.

三个缺点

1.创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2.索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间.

3.当对表中的数据进行增加丶删除和修改的时候,索引也要动态的维护,这样就降低了数据维护速度.
索引的四个优点三个缺点

索引的分类:

1.普通索引和唯一索引

普通索引:允许定义索引的列中插入重复值和空值

唯一索引:索引的值必须唯一,但允许有空值.如果是组合索引,则列值的组合必须唯一.

主键索引:是特殊的唯一索引,不允许有空值.

2.单列索引和组合索引

单列索引:即一个索引只包含单个列,一个表可以有多个单列索引.

组合索引:在表的多个字段组合上创建索引,只有在查询条件使用了这些字段的左边字段时,索引才会被使用.使用组合索引时遵循左前缀集合

3.全文索引

FULLTEXT ,在定义索引列上全文查找,允许插入空值和重复值,CHAR VARCHAR TEXT  数据类型只有myisam支持全文索引

4.空间索引

 

创建索引

 1.主键索引  加速查询+数据唯一(不允许有空值和一个表只能有一个主键索引)
 
 
 #方式一:
create table tb3(
   id int not null auto_increment primary key,
   name varchar(50) not null,
   age int default 0 
);

#方式二:
create table tb3(
   id int not null auto_increment,
   name varchar(50) not null,
   age int default 0 ,
   primary key(id)
);

alter table tb3 add primary key(id);

#方式一
alter table tb3 drop primary key;

#方式二:
#如果当前主键为自增主键,则不能直接删除.需要先修改自增属性,再删除

alter table tb3 modify id int ,drop primary key;




-- 2.唯一索引  加速查询+保证索引值的唯一性(允许有一个null值,并且可以有多个唯一索引)

create table t2(
    id int not null,
    age int,
    UNIQUE index idx_age(age)
);

DROP INDEX idx_age on t2;


-- 3.普通索引 +加速查询

create table t3(
    id int not null,
    age INT,
    INDEX idx_id_age(id,age)
);

2.辅助索引(非聚集索引)与聚集索引的区别?

区分度

覆盖索引

3.索引命中
    #1. 范围查询(>、>=、<、<=、!= 、between...and)
    #1. = 等号
    select count(*) from userinfo where id = 1000 -- 执行索引,索引效率高
    
    #2. > >= < <= between...and 区间查询
    select count(*) from userinfo where id <100; -- 执行索引,区间范围越小,索引效率越高
    
    select count(*) from userinfo where id >100; -- 执行索引,区间范围越大,索引效率越低
    
    select count(*) from userinfo where id between 10 and 500; -- 执行索引,区间范围越大,索引效率越低
    
   #3. != 不等于
   select count(*) from userinfo where id != 1000;  -- 索引范围大,索引效率低
   
   
#2.like '%xx%'
    #为 name 字段添加索引
    create index idx_name on userinfo(name);
    
    select count(*) from userinfo where name like '%xxxx%'; -- 全模糊查询,索引效率低
    select count(*) from userinfo where name like '%xxxx';   -- 以什么结尾模糊查询,索引效率低
  
    #例外: 当like使用以什么开头会索引使用率高
    select * from userinfo where name like 'xxxx%'; 

#3. or 
    select count(*) from userinfo where id = 12334 or email ='xxxx'; -- email不是索引字段,索引此查询全表扫描
    
    #例外:当or条件中有未建立索引的列才失效,以下会走索引
    select count(*) from userinfo where id = 12334 or name = 'alex3'; -- id 和 name 都为索引字段时, or条件也会执行索引

#4.使用函数
    select count(*) from userinfo where reverse(name) = '5xela'; -- name索引字段,使用函数时,索引失效
    
    #例外:索引字段对应的值可以使用函数,我们可以改为一下形式
    select count(*) from userinfo where name = reverse('5xela');

#5.类型不一致
    #如果列是字符串类型,传入条件是必须用引号引起来,不然...
    select count(*) from userinfo where name = 454;
        
    #类型一致
    select count(*) from userinfo where name = '454';

#6.order by
    #排序条件为索引,则select字段必须也是索引字段,否则无法命中  
    select email from userinfo ORDER BY name DESC; -- 无法命中索引

    select name from userinfo ORDER BY name DESC;  -- 命中索引
        
    #特别的:如果对主键排序,则还是速度很快:
    select id from userinfo order by id desc;
几种常用的创建索引的方法

 

posted on 2018-04-10 19:00  仓鼠大人爱吃肉  阅读(231)  评论(0编辑  收藏  举报