Mysql索引

目录

一、什么是索引

二、什么情况下需要使用索引

三、索引在哪些情况下会失效

四、SQL索引执行情况

五、下面是查看索引使用情况:

六、索引类型type


一、什么是索引

索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据;拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使

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

1.1:索引具体采用的哪种数据结构

常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,InnoDB/Myisam引擎,默认的都是B+树;MyISAM不支持哈希索引,而InnoDB中的hash索引是存储引擎根据B-Tree索引自建。

1.2:hash索引和b+ tree索引区别

哈希索引适合等值查询,但是不无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题

二、什么情况下需要使用索引

(1)列经常被用于where条件中

(2)列中有大量的空值

(3)表几乎没有被修改

(4)数据量很大,只有2-4%的数据被选出来

三、索引在哪些情况下会失效

(1)对列进行计算或者是使用函数,则该列的索引会失效

(2)不匹配数据类型,会造成索引失效

(3)where语句中使用了IS NULL或者IS NOT NULL,会造成索引失效

(4)使用了反向操作,该索引将不起作用

(5)使用了link操作,索引就将不起作用

(6)在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用

四、SQL索引执行情况

EXPLAIN SQL;

五、下面是查看索引使用情况:

show global status like '%Handler_read%';不加global默认是show session status like '%Handler_read%';

  1. handler_read_key:这个值越高越好,越高表示使用索引查询到的次数  
  2. handler_read_rnd_next:这个值越高,说明查询低效 

六、索引类型type

首先类型有许多,这里我只给大家介绍企业里面用的最多的类型:

system>const>eq_ref>ref>range>index>ALL

查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < const < system

越往右边,性能越高,比如system就比ALL类型性能要高出许多,其中system、const只是理想类型,基本达不到;

我们自己实际能优化到ref>range这两个类型,就是你自己写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到ref>range这两个级别;

ALL:全表扫描,对于数据表从头到尾找一遍select * from 表名,特别的:如果有limit限制,则找到之后就不再继续向下扫描 select * from 表名 where name = '张三' limit 1;虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。

INDEX:全索引扫描,查询全部索引中的数据,对索引从头到尾找一遍,select id from 表名-->你把id这一列给查了一遍前提是ID有索引
       RANGE:对索引列进行范围查找select *  from 表名 where id < 10;
                        PS:between and in >   >=  <   <=  操作
                        注意:in 有时会失效,导致为ALL;

INDEX_MERGE:合并索引,使用多个单列索引(index)搜索select *  from 表名 where name = 'xx' or id in (11,22,33);
       REF :根据索引查找一个或多个值select *  from 表名 where name = 'xx';
       EQ_REF: 连接时使用primary key(主键) 或 unique(外键)类型select 表1.id,表2.name from 表1 left join 表2 on 表1.id = 表2.nid;
      CONST:表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次,即只有一条数据会匹配。select * from tb1 where id = 2 ;
     SYSTEM: 表仅有一行(=系统表)。这是const联接类型的一个特例。

七、结语

参考文章:https://blog.csdn.net/ssspk_/article/details/89422085

https://www.runoob.com/mysql/mysql-index.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值