MySQL索引篇

索引的分类
索引类型有两种, 一种是BTree索引, 一种是Hash索引。本篇只介绍BTree索引。

BTree索引

BTree索引的使用范围

  • 精确匹配
  • 范围匹配
  • Like前缀查询

Like关键字, 只有前缀查询才会使用到索引, 其余Like都不会使用到索引。

尽管使用字符串前缀匹配可以使用索引, 但效率不会很高, 所以要慎用Like关键字。只要使用了Like, 这个优化难度就比较大。
like前缀使用索引的速度是由匹配字符串的精确程度,匹配字符串精度越高,速度越快,否则反之,匹配范围过大时也会有不使用索引的情况。

复合索引

复合索引和普通索引差别不大。重点在于复合索引是以左侧为基准,左侧字段的选择性一定要高。
字段值的重复性越少,重复性就越高。比如性别字段,男和女,选择性就特别低。

在查询过程中使用复合索引时, 必须包含左侧列, 不然索引会失效。

索引的优化策略

索引失效的情况

  1. 索引的选择性太差
  2. 使用了not关键字/使用了<>
  3. where字句跳过左侧索引列,直接查询右侧索引字段(复合索引)
  4. 对索引列进行计算或使用函数(索引列不独立)
  5. 使用or 查询部分字段没有使用索引
  6. 字符串条件没有使用’’
  7. 索引字段没有添加 not null约束
  8. 隐式转换导致索引失效

关于or为什么会导致索引失效, 拿BTree索引来讲, BTree索引是有序的, 正因为是有序的, 所以支持范围查找, 当where中的两个字段都有各自的索引, 此时使用or关键字, 因为不同的两个字段的索引的顺序并不相同,这时就无法同时用两个索引判断一条记录是否满足条件,所以为了做这样的过滤,只能放弃其中一个索引,甚至做全表扫描。

关联表的两个字段类型不一样时会进行隐式转换, 此时会导致索引失效。

使用索引优化排序

Order By 字段与索引字段顺序相同时, 索引还可以进一步优化排序速度(前提是列的排序必须一致, 如果列是乱序, 就无法保证)。

  • 当排序中出现了索引左侧列, 则允许使用索引排序。
  • 左侧字段单字段排序时, 索引支持升降序。
  • 多字段排序, 左侧字段必须是升序, 且顺序不能打乱
//创建联合索引
CREATE INDEX index_name ON test (uid, cid);
//索引生效
SELECT * FROM test WHERE uid <100000 ORDER BY uid,cid;
//索引生效
SELECT * FROM test WHERE uid <100000 ORDER BY uid,cid DESC;
//索引失效
SELECT * FROM test WHERE uid <100000 ORDER BY uid DESC,cid;
//索引失效
SELECT * FROM test WHERE uid <100000 ORDER BY cid, uid;

Explain执行计划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL高级索引优化主要涉及MySQL Query Optimizer(查询优化器)和索引的使用。MySQL Query Optimizer是MySQL中负责优化SELECT语句的模块,通过计算分析系统中收集到的统计信息,为客户端请求的Query提供最优的执行计划,即最优的数据检索方式。索引是帮助MySQL高效获取数据的数据结构,它可以提供排序和查询的功能。 在索引优化中,需要考虑以下情况适合建立索引: 1. 主键自动建立唯一索引。 2. 频繁作为查询条件的字段应该创建索引。 3. 查询中与其他表关联的字段,尤其是外键关系,应建立索引。 4. 单键或组合索引的选择问题,通常在高并发情况下倾向于创建组合索引。 5. 查询中排序的字段,通过索引进行访问可以大大提高排序速度。 6. 查询中用于统计或分组的字段。 而以下情况不适合建立索引: 1. Where条件中用不到的字段不需要创建索引。 2. 表记录太少,通常建议超过300万条记录再考虑建立索引。 3. 经常进行增删改操作的表,建立索引可以提高查询速度,但同时会降低更新表的速度。 4. 数据重复且分布平均的字段,对于包含许多重复内容的数据列,建立索引没有太大实际效果。 因此,在索引优化中,应该根据具体情况选择最经常查询和最经常排序的数据列来建立索引,避免对不需要的字段建立索引,以提高查询效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL高级(SQL优化、索引优化、锁机制、主从复制)](https://blog.csdn.net/yuan2019035055/article/details/122310447)[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_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值