mysql索引

目录

索引概述

索引优缺点

索引结构

相对于B-Tree区别:

hash索引特点

存储引擎支持

索引分类

索引语法

慢查询日志

索引使用

验证索引效率

最左前缀法则

范围查询

索引列运算

字符串不加引号

模糊查询

or连接的条件

数据分布影响

sql提示

覆盖索引

前缀索引

单列索引与联合索引


索引概述

介绍

索引(index)是帮助MYSQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
索引优缺点

索引结构

MYSQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

注意:我们平常所说的索引,如果没有特别指明,都是指b+树结构组织的索引。

相对于B-Tree区别:
1. 所有的数据都会出现在叶子节点
2. 叶子节点形成一个单向链表

hash索引特点
1. hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,....)
2. 无法利用索引完成排序操作
3. 查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引
存储引擎支持
在mysql中,支持hash索引的是Memory引擎,而innoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的

索引分类

索引语法
创建索引
    create [unique|FUlltext] Index index_name on table_name (index_col_name...);
查看索引 
    show index from table_name;
删除索引
    drop index index_name on table_name;

sql性能分析

sql 执行频率
    mysql 客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 insert 、update、delete、select的访问频次。
    show global status like 'Com______';
慢查询日志
慢查询日志记录了所有超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句的日志。mysql的查询日志默认没有开启,需要在mysql的配置文件(/etc/my.cnf)中配置如下信息:
show variables like 'slow_query_log';

profile详情

explain执行计划

explan 或者 desc命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。
语法:
#直接在select语句之前加上关键字explain/desc
explan select * from table_name
desc select * from table_name

索引使用
验证索引效率
在未建立索引之前,执行如下sql语句,查看sql的消时。
select * from tb_sku where sn = '100000000';
最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。
如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
范围查询
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效
索引列运算
不要在索引列上进行运算操作,索引将失效。
字符串不加引号
字符串类型字段使用时,不加引号,索引将失效。
模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
or连接的条件
用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
数据分布影响
如果MYSQL评估使用索引比全表更慢,则不使用索引。
sql提示
sql提示,是优化数据库的一个重要手段,简单来说,就是在sql语句中加入一些人为的提示来达到优化操作的目的
use index; // 建议使用
explain selcet * from tb_user_ use index(idx_user_pro) where profession = '软件工程'; 
ignore index; // 忽略使用
force index; // 强制使用
覆盖索引
尽量使用覆盖索引 (查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *
​
注意:
using index condition : 查询使用了索引,但是需要回表查询数据
using where;using index : 查询使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
前缀索引
当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率。此时可以只字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

单列索引与联合索引
单列索引:即一个索引只包含单个列。
联合索引:即一个索引包含了多个列。
在业务场景中,如果存咋多个查询条件,考虑针对查询字段建立索引时,建议建立联合索引,而非单列索引。

注意:多条件联合查询时,mysql优化器会评估哪个字段的索引效率更高,会选择索引完成本次查询。

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值