Mysql——索引

什么是索引

索引是一个二叉树

首先每个表有一个主键,Mysql会以主键的值构造一个棵树,叶子节点存放着以该主键对应的整行数据。所以一张表在数据结构上等价于一颗以主键排序好的树。
如果没有主键呢?
如果没有主键,那么mysql会自动生成一个内部列,以内部列构造一棵树。(按照主键或内部列访问是最快的)
那么这张表的树和索引的树有什么关系呢?
对于其他的自己建的索引,一般是叫辅助索引。
对于辅助索引,叶子结点存放了两个东西:辅助索引的值(排序好的)和对应的主键。

比如执行如下查询语句

//adress加索引
select * from User where address=xxx;

mysql直接从address索引找到符合条件的叶子结点,从该叶子节点中取出主键的值,跑去主键那棵树取回整行索引。

但如果是

//adress加索引
select address from User where address=xxx;

就不用跑回主键索引查整行数据。

什么时候加索引

1.查询分组和排序分组的时候最好是加索引
2.对于区分度高的字段加索引

强制索引

对于索引比较多的时候,可以使用强制索引

select * from XXX FORCE INDEX(address)

联合索引

//添加联合索引
alter index u_index on user(name,address);
select XXX from user where name=XXX and  address=XXX;

这时候会触发联合索引提高查询速率,如果没有加索引就会进行外部排序影响查询效率。
触发联合查询?
1、使用联合索引的全部索引键,可触发索引的使用。
例如:SELECT * FROM user WHERE name=‘Jacke’ AND address=‘s’

2、使用联合索引的前缀部分索引键,如“name”,可触发索引的使用。
例如:SELECT * FROM user WHERE name=‘Jacke’

3、使用部分索引键,但不是联合索引的前缀部分,如“key_part_2 常量”,不可触发索引的使用。
例如:SELECT * FROM user WHERE address=‘s’

4、使用联合索引的全部索引键,但索引键不是AND操作,不可触发索引的使用。
例如:SELECT * FROM user WHERE name=‘Jacke’ OR addres=‘s’

join字段加索引

先看简单的

select XXX from t1 join t2 on t1.id = t2.id

mysql会比较t1和t2哪个表小,假设t1小(这里主要指行数少)。然后就把t1的id进行全表扫描,然后去t2里一个一个查。所以这里可以给t2加上索引。t1反正要全表扫描了加索引也没用。

如果加上过滤条件

select XXX from t1 join t2 on t1.id = t2.id where  t1.address=xxx AND t2.address=xxx

如果这样的话大小表就不绝对了,可能之前大表查出来的结果集反而小。所以此时加联合索引是最优。

索引失效有哪些情况

  • like通配符放最前的,还有这几种运算符无法用到索引。

select … like ‘%xxx%’
select … not in()
select … != XXX
select … <> xxx

  • 对列进行函数运算无法用到索引
    select … where md5(password)=‘xxx’
  • 数据类型转换走不到索引
    select … where mobile = 13711112222
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,SUM函数是用来计算某一列的总和的。然而,SUM函数本身并不会使用索引,因为它需要扫描整个表来计算总和。对于SUM函数的索引优化,有以下几点可以考虑: 1. 建立涵盖索引:可以为包含SUM计算的列和其他需要的列建立一个涵盖索引。涵盖索引是一个包含了查询所需的所有列的索引,这样查询可以直接从索引中获取数据,而不需要回表读取数据行。 2. 使用汇总表:可以创建一个汇总表,将SUM计算的结果存储在汇总表中,并使用触发器或定时任务来保持汇总表的数据与源表同步。在查询时,可以直接从汇总表中获取SUM计算的结果,而不需要扫描整个表。 3. 使用分区表:如果数据量非常大,可以考虑将表进行分区,并在分区表上创建索引。这样可以将计算过程分散到多个分区上,提高计算效率。 需要注意的是,以上方法仅适用于某些特定情况下的优化,并不是通用的方法。在具体情况中,还需要考虑表的大小、数据的分布情况、查询的频率等因素,以选择合适的优化方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysql——》索引的创建与使用](https://blog.csdn.net/weixin_43453386/article/details/124518403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【2.21】MySQL索引、动态规划、学习方法](https://blog.csdn.net/weixin_62633072/article/details/129150005)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值