Mysql --- 索引

目录

索引的介绍

数据库中专门用于帮助用户快速查找数据的一种数据结构. 类似于字典中的目录,查找字典内容时

可以根据目录查找到数据的存放位置,然后获取

索引的作用

约束和加速查找

常见的索引有哪几种

- 普通索引

- 唯一索引

- 主键索引

- 联合索引 (多列)

    -联合主键索引

    -联合唯一索引

    -联合普通索引

无索引和有索引的区别是什么?

  无索引的话 从前往后一条一条查询

  有索引 : 创建索引的本质, 就是创建额外的文件,(某种格式存储,查询的时候,先去格外的文件找,定好位置,然后再去原始表中直接查询,但是创建索引越多,会对硬盘也是有损耗)

那建立索引的目的是什么?

  1,额外的文件保存特殊的数据结构

  2,查询快,但是插入更新删除依然慢

  3,创建索引后,必须命中索引才能有效

hash索引和BTree索引

  1,hash类型的索引 : 查询单条快, 范围查询慢

  2,btree类型的索引 : b+树,层数越多,数据量指数级增长

普通索引

作用:  仅有一个加速查找

create table userinfo(
                   nid int not null auto_increment primary key,
                   name varchar(32) not null,
                   email varchar(64) not null,
                   index ix_name(name)
               );
创建表 + 普通索引

普通索引:

  create index 索引的名字 on 表名(列名)

删除索引:

  drop index 索引的名字 on 表名

查看索引:

  show index from 表名

唯一索引

唯一索引有两个功能:加速查找和唯一约束

create table userinfo(
                   id int not null auto_increment primary key,
                   name varchar(32) not null,
                   email varchar(64) not null,
                   unique  index  ix_name(name)
               );
创建表+唯一索引

唯一索引:

  create unique index 索引名 on 表名

删除唯一索引:

  drop index 索引名 on 表名;

主键索引

主键索引有两个功能 : 加速查找和唯一约束

create table userinfo(

                   id int not null auto_increment primary key,
                   name varchar(32) not null,
                   email varchar(64) not null,
                   unique  index  ix_name(name)
           )
          or

           create table userinfo(

                   id int not null auto_increment,
                   name varchar(32) not null,
                   email varchar(64) not null,
                   primary key(nid),
                   unique  index  ix_name(name)
         )

创建表+主键索引
创建表 + 主键索引

主键索引:

  alter table 表名 add primary key(列名);

删除主键索引:

  alter table 表名 drop primary key;

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

组合索引

组合索引是将n个列组合成一个索引

联合普通索引:

    create index 索引名 on 表名(列名1,列名2);

索引名词

覆盖索引:  在索引文件中直接获取数据

例:  select name from userinfo where name ="afan1000000";

索引合并: 把多个单列索引合并成使用

例: select * from userinfo where name="afan1000000" and id="1313131";

什么是最左前缀呢?

最左前缀匹配:
        create index ix_name_email on userinfo(name,email);
                 select * from userinfo where name = 'alex';
                 select * from userinfo where name = 'alex' and email='alex@oldBody';

                 select * from userinfo where  email='alex@oldBody';

             如果使用组合索引如上,name和email组合索引之后,查询
             (1)name和email ---使用索引
             (2)name        ---使用索引
             (3)email       ---不适用索引
              对于同时搜索n个条件时,组合索引的性能好于多个单列索引
        ******组合索引的性能>索引合并的性能*********

索引的注意事项

  1.避免使用select * 

  2. count(1) 或 count(列) 代替 count(*)

  3.创建表时尽量使用char代替varchar

  4.表的字段顺序固定长度的字段优先

  5.组合索引代替多个单列索引(经常使用多个条件查询时)

  6.尽量使用短索引(create index ix_title on tb(title(16)); reshuffle的数据类型 text类型

  7.使用连接(join) 来代替子查询

  8.连表时注意条件类型需一致

  9.索引散列(重复少) 不适用于建索引,例如:性别不合适



猜你喜欢

转载自www.cnblogs.com/liuafan/p/9567383.html