MySQL的索引

一 ,索引简介

索引在MySQL中也叫做’键 key’,是存处引擎用于快速找到记录的一种数据结构.
索引对于良好的性能非常关键,尤其是当表中的数据越来越多,索引对于性能的影响愈发重要.
索引优化应该是对查询性能优化的最有效手段了,索引能够轻易将查询性能提高好几个数量级.
索引相当于新华字典的音序表,如果要查某个汉字,不使用音序表,则需要从几百页中的数据中去找找个汉字
简单理解就是,索引就像一本书的目录,让你很快能够查询到你想要的数据.

二,索引的分类

  • 普通索引

  • 唯一索引

  • 全文索引

  • 单列索引

  • 多列索引

  • 空间索引

三 ,索引的使用语法

例子:我们用一个存储过程先往一张表中多插入点数据,等会演示
DELIMITER $$
​
CREATE
    PROCEDURE testProcedure()
    BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE (i<20000) DO
        INSERT INTO mytestdb.test VALUES(i,'aaaa');
        set i=i+1;
     END WHILE;   
    END$$
​
DELIMITER ;
 查看所有存储过程 show procedure status\G  -- \G 排版一下显示格式,看起来好看些
 查看创建某个存储过程的语句 show create procedure testProcedure;
 调用存储过程 call autoinsertdata();  --括号可可不写
 
 call testProcedure();

创建索引 使用 index 或者 key 关键字

  • 方式1:创建表的时候创建索引

  • 方式2:表已经创建好了,再去创建索引

  • 方式3:表已经创建好了,通过修改 alter table 语句再去创建索引

​
​
方式1:语法 
 create table 表名(
            字段名 数据类型 [约束],
            字段名2 数据类型2 [约束],
            [unique|fulltext|spatial] index|key
            [索引名](字段名[(长度)] [ASC|DESC])   -- 注意中括号里面的是可选项
    );
例如:创建普通索引
        create table student(
            sid int,
            sname varchar(32),
            index(sname) -- 给name 字段建立普通索引 注意字段不要带引号
        );
查看建表语句可以看到这个sname 字段,有没有加上索引
show create table student;
​
例如:创建唯一索引
    create table test(
        tid int,
        tname varchar(32),
        unique index(tname)  -- 创建唯一索引,这列的值不能重复
    );
    
 例如:创建全文索引,一般针对这个字段是 text类型,比如存了一篇文章
 create table test2(
    tid int,
    tname varchar(32),
    tlog text,
    fulltext index myIndex (tlog)  -- 这个myIndex是你起的索引名,一般省略不写
 );
 
 
 例如:创建多列索引,给多个字段创建索引
  create table test2(
    tid int,
    tname varchar(32),
    tlog varchar(100),
    index my_Index (tname,tlog)  -- 给 tname 和 tlog 两个列都建立索引
 );
方式2:
方式2:创建索引的语法 就是表已经存在我们给表中的某个字段,建立索引
    语法: create [unique|fulltext|spatial] index 索引名 on 表名 (字段名[(长度)] [ASC|DESC]);
​
创建普通索引例子
    create index myIndex on student (sname);
创建唯一索引例子
    create unique index myIndex on student (sname);
创建多列索引例子
    create index myIndex on student (sname,slog);
方式3:
方式3:表已经存在,通过使用修改表的语句 alter table 给某个字段建立索引
    语法: alter table 表名 add [unique|fulltext|spatial] index 索引名 on 表名 (字段名[(长度)] [ASC|DESC]);
    
    创建普通索引的例子
        alter table student add index MyIndex(sname);
    创建唯一索引的例子
        alter table student add unique index MyIndex(sname);
    创建多列索引
         alter table student add index MyIndex(sname,slog);
         
         
         alter table test add index MyIndex(id);
 

四,管理索引

查看索引
    show create table 表名\G;
删除索引
    drop index 索引名 on 表名;
测试索引是否提高了效率
    explain select * from student where sid=19999;
     explain select * from usertest where id=19999;
    explain select * from test where id=19999;
    explain 这条测试语句是看查询优化器 怎么通过select语句去查 并没没有真正去查
    
    explain select * from test where id=19999;

五,测试索引的效率,从时间上和查询方式上对比

未加索引索引时 我们查一下,最后面的数据 看下耗时
select * from mytest where id=164733;  
再看一下查询优化器的查询方式
explain select * from test where id=19999;
​
然后我们给 sid 加上索引 再执行 上面两行代码对比一下即可看到加了索引效率会大大提高
这里注意 你的where条件后面使用的字段,加了索引 ,才是去使用索引
​
​
注意:你在建表的时候,如果有主键,这个主键,就带有所有主键索引。

我们在写SQL语句时,有些情况下索引失效

索引失效的7种情况 

简述

什么时候没用

1.有or必全有索引; 2.复合索引未用左列字段; 3.like以%开头; 4.需要类型转换; 5.where中索引列有运算; 6.where中索引列使用了函数; 7.如果mysql觉得全表扫描更快时(数据少);

什么时没必要用

1.唯一性差; 2.频繁更新的字段不用(更新索引消耗); 3.where中不用的字段; 4.索引使用<>时,效果一般;

详述(转)

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:

  • 如果条件中有or,即使其中有部分条件带索引也不会使用(这也是为什么尽量少用or的原因),例子中user_id无索引

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

  • 对于复合索引,如果不使用前列,后续列也将无法使用,类电话簿。

  • like查询是以%开头

  • 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

  • where 子句里对索引列上有数学运算,用不上索引

  • where 子句里对有索引列使用函数,用不上索引

  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

比如数据量极少的表

什么情况下不推荐使用索引?

\1) 数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引

比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

\2) 频繁更新的字段不要使用索引

比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。

\3) 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引

只有在where语句出现,mysql才会去使用索引

4) where 子句里对索引列使用不等于(<>),使用索引效果一般

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值