创建高性能索引

如何创建高性能的索引 如何创建高性能的索引 EXPLAIN 类型分析 explain 指令可以帮助我们查看查询优化器 处理 执行计划 的一些细节信息 语法: explain + 执行计划 假如我们有这样的两张表(分类表和商品表),我们将结合explain 字段进行说明: #分类 CREATE TABLE category ( id int primary key auto_increment, name varchar(50) not null, c_desc varchar(200), create_time 阅读详情

数据库的索引,了解一下大致原理以及索引的策略差不多就行了。实际运用的时候,最好收集一下数据库的查询语句,然后根据查询频繁程度调整索引策略。

索引类型

通常所说的索引都是B-Tree索引,存储引擎以不同的方式使用B-Tree索引,性能各不相同,各有优劣。

例如:MyISAM使用前缀压缩技术使得索引更小,但InnoDB则按照原数据格式进行存储。MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。

B-Tree索引适用的查找:

  • 全值匹配
  • 匹配最左前缀(匹配索引做左边的列)
  • 匹配列前缀(匹配某一列的值的开始部分)
  • 匹配范围值
  • 精确匹配某一列并范围匹配另外一列
  • 只访问索引的查询

B-Tree的限制:

  • 如果不是按照索引的最左列开始查找,则无法使用索引
  • 不能跳过索引中的列
  • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找

哈希索引: 基于哈希表实现,所以非常快。只有精确匹配索引所有列的查询才有效。在MySQL中只有Memory引擎显示支持哈希索引。

由于这个索引不常用,这里就简单说一下优缺点: 优点:

  • 速度快,比B-Tree要快。

缺点:

  • 不存储字段值,只包含哈希值和行指针
  • 按照哈希值排序,而不是按照索引值的顺序存储,所以无法用于排序。
  • 不支持索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值。
  • 只支持等值查询
  • 如果有哈希冲突,那么一些索引维护操作的代价也会很高

InnoDB有一个“自适应哈希索引”功能,InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引。这就让B-Tree索引也具有哈希索引的一些优点,但这是一个完全自动的内部的行为,用户无法干预,顶多是关闭该功能。

创建自定义哈希索引: 基本思路是这样的,在B-Tee基础上创建一个伪哈希索引。这和真正的哈希索引不是一回事,因为还是使用B-Tree进行查找,但是它使用哈希值而不是键本身进行索引查找。你需要做的就是在查询的where子句中手动指定使用哈希函数。(这样可以用很小的索引为很长的键创建索引,但是查询的时候需要指定查询的常量,以免哈希冲突的情况下产生逻辑错误。)

索引三星系统

  • 索引将相关的记录放到一起
  • 索引中的数据顺序和查找中的排列顺序一致
  • 索引中的列包含了查询中需要的全部列

索引策略

  • 独立的列,索引不能是表达式的一部分也不能是函数的参数。(个人觉得这个反倒是写查询语句的时候需要注意的地方,估计是角度不同吧。)
  • 前缀索引和索引选择性
    • 前缀索引是指用某个键的前N个字段作为索引值
    • 索引选择性指的是不重复的索引值和总记录数的比值,当然是越接近1越好。
    • 建索引的时候如果遇到比较纠结的状况,可以优先选择索引选择性比较高的列。
  • 多列索引(一个索引包含多个列),索引合并有时候是优化的结果。
    • 当出现服务器对多个索引做相交操作时(多个and),通常意味着需要一个包含所有相关列的多列索引
    • 当出现服务器对多个索引做联合操作时(多个or),通常需要消耗大量CPU和内存资源在算法的缓存、排序和合并操作上。
    • 更重要的是,优化器不会把这些计算到成本里面去。
  • 选择合适的索引顺序
  • 聚簇索引
  • 覆盖索引,如果一个索引包含所有需要查询的字段的值,我们就称之为“覆盖索引”
    • MySQL查询优化器会在查询前判断是否有一个索引能进行覆盖。假设索引覆盖率WHERE条件的字段,但不是整个查询涉及的字段。即使条件为false,MySQL5.5和更早的版本也总是会回表获取数据行,尽管这一行最终还是会被过滤掉。
    • 关于非聚簇索引无法成为覆盖索引的一个解决办法(非聚簇索引包含所有WHERE中的字段):就是先在非聚簇索引中根据条件查询出来主键,然后再作为子查询或者Inner Join的一部分,根据主键查询出来需要的字段。这种办法可以叫做“延迟关联”,这样在数据量比较小的时候效果很明显;如果数据量比较大,跟完全无法利用索引覆盖来比,效果差不多。
  • 利用索引扫描来做排序
    • 索引列的顺序和ORDER BY子句的顺序一致,并且所有列的排序方式都一样时
    • 如果查询关联多张表,只有当ORDER BY子句引用的字段全为第一个表时
    • ORDER BY和查找型查询的限制是一样的
    • 当前导列为常量的时候(如:sex in ('m', 'f')),ORDER BY子句可以不满足索引的最左前缀的要求
  • 压缩(前缀压缩)索引
    • MyISAM压缩每个索引块的方法是,先完全保存索引块中的第一个值,然后将其他值和第一个值进行比较得到相同前缀的字节数和剩余的不同后缀部分,把这部分存储起来即可。
    • 可以在CREATE TABLE语句中指定PACK_KEYS参数来控制压缩方式
    • 优点在于减少磁盘空间(可能只需要十分之一),适用于CPU密集型业务
    • 缺点在于随机查找和倒序扫描特别慢

支持多种过滤条件

这种状况下有这么个策略,可以将那些选择性不高的列,建在索引前面,这样在查询的时候如果此列不是查询条件,可以在WHERE中使用IN()这种策略,比如SEX。然后将那些经常会用于范围查询的放在最后面,比如AGE。

避免多个范围条件:EXPLAIN的输出中从type来看,IN和范围查询都会是range,多个范围查询会比较容易导致索引失效。

维护索引和表

使用CHECK TABLE来检查表是否损坏,REPAIR TABLE来修复,也可以使用如下不作任何操作的命令来修复:

mysql> ALTER TABLE innodb_tb1 ENGINE=INNODB;

更新索引信息:ANALYZE TABLE

mysql索引概念、分类及创建高性能索引 (2)B+Tree的数据结构中,叶子节点的页里面,存放的是索引的字段以及字段对应的主键id;(3)当遇到组合索引的时候,比如字段a,b,c三个字段索引,hash索引是将这三个字段进行hash,然后存储到hash表中,不能仅对a,b或者a,c或者b,c进行部分组合索引,除非再建a,b或者a,c或者b,c索引,加深复杂度。(2)索引列的选择,尽量选择重复率低的列来创建索引,比如id,userName这种,而不要选择gender,枚举类的字段做索引,意义相对不大,因为数据重复,过滤出来的数据依然是那么多。 阅读详情

相关推荐

2.Mysql 高性能创建索引的策略

索引在查询中的作用是什么?在我们的查询中发挥着什么样的作用呢?请记住。

qq_44605317的博客 510

EhCache介绍

ehcache是一个非常轻量级的缓存实现,而且从1.2之后就支持了集群,而且是hibernate默认的缓存provider。EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。   Ehcache的分布式缓存有传统的RMI,1.5版的JGroups,1.6版的JMS。分布式缓存主要解决集群环境中不同的服务器间的数据的...

程序员的天堂 389

zds1104示波器使用指南

(2)将探头连接到探头补偿端,按下auto setup按键,一键捕获。(3)连接需要测量信号,开始查看波形。操作说明书,可以自行查看操作说明书。

m0_61973119的博客 6769

创建高性能的索引

索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。 在数据量小且负载较低时,不恰当的索引对性能的影响可能还不明显,但是当数据量逐渐增大时,性能会急剧下降。索引可以包含一个或者多个列的值。 如果索引包含了多个列,那么列的顺序也十分重要。 因为MySQL只能高效地使用索引的最左前缀列(B+树的数据结构决定的)。 创建一个包含两个列的索引和创建两个包含一列的索引

T Yuan 2099

DDR5内存调优实战:手把手教你搞定Write Leveling Training Mode(附时序图解析)

本文深入解析DDR5内存调优中的Write Leveling Training Mode技术,详细介绍了其核心原理、硬件准备、实战步骤及常见问题解决方案。通过JESD79-5标准定义的反馈机制,帮助硬件工程师精确对齐DQS与CK信号,提升系统稳定性和数据可靠性。附有时序图解析和代码示例,适合DDR5内存系统设计与调试参考。

weixin_29256771的博客 550

国产信创服务器软硬件兼容情况1 --- ARM架构

信创,即信息技术应用创新产业,它是数据安全、网络安全的基础,也是新基建的重要组成部分...

一只猿的自我修养 4741

服务端指南 数据存储篇 | MySQL(04) 索引使用的注意事项

MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,在索引的使用过程中,存在一些使用细节和注意事项。 原文地址:服务端指南 数据存储篇 | MySQL(04)索引使用的注意事项博客地址:blog.720ui.com/ 不要在列上使用函数和进行运算 不要在列上使用函数,这将导致索引失效而进行全表扫描。 select * from news where year(publ...

weixin_34418883的博客 273

SAP(ERP)工艺路线(Routing)业务视角解析

工艺路线(Routing)也是PP模块,即生产制造模块中最重要核心主数据之一,也是ERP(SAP)顾问,必需从业务与系统深入掌握的重要主数据,它也是整个生产计划与生产流程的重要基础。因为执行步骤只是操作层面的认知,业务顾问需要从业务本质上去理解它,要真正从业务视角理解工艺路线的业务价值,而不仅仅是操作层面的认知。因此将工艺路线理解为“有以上业务本质的理解,然后进到SAP系统中,就容易理解工艺路线(Routing)的每一组成部分结构与功能了,本质就是理解制造企业如何将设计意图转化为物理现实的编码规则。

m0_45197968的博客 1501

Mysql索引总结(一)

定义 定义:在mysql中也叫做“键(Key)”,是存储引擎用于快速找到记录的一种数据结构。 理解:索引就像是书的目录,然后找到对应章节的页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。 例子: select id from t_sign where staff_id=’123’ 如果在staff_id列上建有索引,则...

当一堆用不熄灭的柴火 344

ABAP CDS SELECT, parameters 全面解析:把参数化视图玩明白(含可运行示例)

这篇技术博客介绍了ABAP CDS中参数化视图的用法与实践。文章从业务需求出发,解释了参数化视图的必要性,并详细说明了语法规则、参数类型匹配、视图内部参数引用等关键点。重点展示了在JOIN和ASSOCIATION中传递参数的写法,提供了航线分析的完整业务案例和可运行代码示例。文章还总结了视图实体与DDIC视图的差异、会话变量使用技巧等实践要点,特别强调了JOIN中必须显式传参的语法要求。通过真实场景演示,帮助开发者掌握参数化CDS的高效应用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 362

一文搞懂自适应激光控制技术,开启光学新时代

自适应激光控制技术作为现代光学领域的关键技术,以其独特的原理和高效的工作机制,在科研、工业等众多领域展现出了巨大的应用价值。通过对激光波前的实时测量与补偿,它成功克服了激光在传输和应用过程中面临的诸多挑战,显著提升了激光的光束质量和应用效果。在科研领域,它助力天文观测突破大气湍流的限制,让我们得以更清晰地窥探宇宙的奥秘;在激光核聚变研究中,为实现高效的核聚变反应提供了关键支持,为解决能源问题带来了新的希望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2529

MySQL性能优化(三)-- 索引

一、什么是索引及索引的特点索引是一种数据结构索引的特点:查找速度快,排好序,数据结构索引的数据结构类型有:BTREE索引和HASH索引,下面展示的是BTREE索引。BTREE:balan...

u010821757的博客 153

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1158

一文搞定:MySQL索引,如何创建高性能索引

索引基本分为B+树和全文索引,在MySQL中使用B+树较多,重点说说B+树索引在选索引和创建索引时,有三点要素单行访问很慢,特别是在机械存储中按顺序访问范围数据是很快的,有两个原因顺序I/O不需要多次磁盘寻找按顺序读取数据,不需要再额外的排序操作并且GROUP BY查询也无须再做排序和将行按组进行聚合计算了索引覆盖查询是很快的。如果一个索引包含了查询需要的所有列,那么存储引擎就不需要再回表查找行。

Minxinbb 959

【无人机路径规划】基于强化学习实现多无人机路径规划

【无人机路径规划】基于强化学习实现多无人机路径规划

k8291121的博客 1656

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MySQL精进之路——创建高性能的索引

本文介绍了MySQL索引的基础知识、类型及高性能索引策略。主要内容包括: 索引基础:索引是帮助存储引擎快速查找记录的数据结构,B-Tree是最常见索引类型,支持全键值、范围查询等,但需遵循最左前缀原则。 索引类型: B-Tree索引:适用于大多数查询场景,但有限制条件 哈希索引:仅支持精确匹配,Memory引擎默认使用 全文索引:用于文本关键词搜索 空间索引:支持地理数据 高性能索引策略: 避免在索引列上使用函数或表达式 合理使用前缀索引优化长字段 多列索引要考虑列顺序和选择性 聚簇索引影响数据存储方式,需

weixin_52344200的博客 985

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

高性能mysql第五章——创建高性能的索引

第五章 创建高性能的索引 ORM(对象关系映射)只能产生合理的查询,而不能产生适合索引的

喵喵喵 307

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL的故事——创建高性能的索引

另外,其它不同类型的索引(例如哈希索引或者全文索引)也不会是B-Tree索引的冗余索引,而无论覆盖的索引列是什么。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引,这样就让B-Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。要理解MySQL中索引是如何工作的,最简单的方法就是去看看一本书的“索引 ”部分:如果在一本书中找到某个特定主题,一般会先看书的“索引”,找到对应的页码。

weixin_45841848的博客 634

MySQL怎样创建高性能的索引

本文为《高性能MySQL(第三版)》一书的摘要总结 索引基础 索引优化是对查询性能优化最有效的手段。 索引可以包含多个列的值,如果索引包含多个列,列的顺序非常重要,因为MySQL只能高效使用索引的 最左前缀列。 索引类型 B-Tree索引 使用B-Tree(实际上是B+Tree)数据结构来存储数据。 可以使用B-Tree索引的查询类型: 全值匹配 和索引中的所有列进行匹配。 匹配最左列 匹配列前缀 只匹配某一列的值的前缀部分,后续查询条件将不会使用索引。 匹配范围值 匹配某一列的.

风萧水寒的博客 258

MySQL中如何创建高性能索引

索引的弊端 这么说,索引这么好用,我们疯狂创建索引岂不是速度飞起?其实并不是的,在学习如何更好的使用索引之前先要了 解一下使用它的代价,它在空间和时间上都会拖后腿。 空间上的代价 这个是显而易见的,每建立一个索引都要为它建立一棵 B+树,每一棵 B+树 的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大 的 B+树由许多数据页组成会占据很多的存储空间。 时间上的代价 每次对表做出任何修改,我们都需要去维护该表下面所有的索引信息。这必然会对性能造成影响。 那么如何建立必

weixin_47184173的博客 508

高性能Mysql之创建高性能的索引

11111

weixin_42575542的博客 229
上一篇: Schema与数据类型优化
下一篇: MongoDB Sharding
java_4_ever
博客等级 码龄16年 8粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值