mysql -索引

索引

一、概念

  • 在数据表的字段上添加,为了提高查询效率存在的一种机制

  • 索引是为了缩小扫描范围而存在的一种机制

  • 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列

  • 缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

  • 不要随意添加,需要维护;建议通过主键通过索引

二、实现原理

索引也是需要排序的,底层是一个自平衡的二叉树

三、说明

  • 在任何数据库当中主键都会自动添加索引对象,id字段上自动创建索引
  • 一个字段上如果有unique约束,也会自动创建索引对象
  • 任何数据库当中的任何一张表任何一条记录在硬盘存储上都有 一个硬盘的物理存储编号
  • 在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,
    • myisam 存储引擎中,索引存储在一个.MYI文件中
    • innodb存储引擎中,所有存储在一个逻辑名称叫做tablespace的当中
    • memory存储引擎当中索引存储在内存中,不管索引存储在哪里,索引在mysql当中都是一个树的形式存在(自平衡二叉树:B-Tree)

四、字段添加索引

  • 条件1.数据量庞大

  • 条件2.该字段经常出现在where后,以条件的形式存在,该字段总是被扫描

  • 条件3.该字段很少的DML(insert delete update)操作(因为DML之后,索引需要重新排序)

五、创建索引

create index 索引名 on 表名(字段)

六、删除索引

drop index  索引名 on  表名

七、查看索引

show index from 表名;

-- 查看某一字段
explain select  *  from 表名 where 字段= ‘值‘

explain select *  from emp  where ename=‘KING‘;

八、索引失效

1.查找内容中使用模糊查询

条件以‘%’开头,索引失效

select *  from  emp  where   ename   like "%T"

2.使用or的时候

  • 使用or 要求or两边字段都有索引,索引才能生效,但凡一边没有,索引不生效
  • 建议使用union

3.使用复合索引的时候,没有使用左侧的列查找,索引失效

create  index emp_job_sal on where(job,sal);
explain select *  from emp where job= ‘MANAGER‘; -- 左侧的列查找
explain select *  from emp where sal=800 ;       -- 右侧的列查找索引失效

4.where 条件中,索引的字段参加运算,索引失效

create  index emp_job_sal on where(sal);
explain select *  from emp where sal=800 ;   
explain select *  from emp where sal+1=800 ; 字段运算索引失效

5.where 条件中,索引列使用了函数

create  index emp_job_sal on where(job);
explain select *  from emp where lower(job)= ‘MANAGER‘

九、索引分类

  • 索引是数据库优化的重要手段

  • 索引的分类

    • 单一索引:一个字段上添加索引

    • 复合索引:两个字段或更多的字段上添加索引

    • 主键索引:主键上添加索引

    • 唯一性索引:具有unique约束的字段上添加索引

    • 注意:唯一性索引比较弱,字段上添加索引用处不大

mysql -索引

上一篇:达梦数据库-Linux 下 命令行规范化安装 DM8-单机版


下一篇:所有编程语言中的栈操作,底层原理都在这里