首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL查询为什么选择使用这个索引?——基于MySQL 8.0.22索引成本计算

本文参考《MySQL是怎样运行的》,与书中不同的是,书中数据库版本5.7.22,本文使用8.0.22,不同版本数据库计算成本常数是不同的,书中是1W条记录,我这里是近10W条记录,经过实践,是对于书中的补充和验证...,计算的成本和实际成本对比,让大家更容易理解MySQL为什么要使用这个索引。...所以MySQL很粗暴的认为不管这个块有没有加载到内存中,使用的成本都是1.0。   至于为什么在8.0+ 版本中成本常数变小了呢?...实际中,我们想分析MySQL为什么选择这个索引,直接如下例子,强制索引后分析成本,根本不用自己手动计算,本文是给大家分析,让大家理解思路。...没有连接条件的表连接查询会产生笛卡尔积,一般都会写条件。   为什么我们分析内连接老是假设驱动表?难道左表不是驱动表?不一定,内连接左右表顺序可以任意互换,优化器会优化其连接顺序的。

71810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL联表查询的索引使用

    项目中一般使用的都是单表查询,但是在一些业务场景下,偶尔会选择联表查询,一直对联表查询时如何使用索引一直感到很好奇。...正好近期项目中遇到一个问题,联表查询时,没有建立索引,耗时居然达到了可耻的10分钟,所以趁机了解了一下。...联表查询的算法Nested-Loop Join,MySQL查询的结果集是3张表的笛卡尔积,所以效率特别低。...[(none)]> kill 3468722 结论 关联字段一定要添加索引 where条件的索引建立,一定要查看explain,mysql的工作方式经常跟我们想的不一样 增加慢查询日志(dba呢?)...参考 关于 MySQL LEFT JOIN 你可能需要了解的三点 MySQL JOIN原理 MySQL查询优化——连接以及连接原理 MySQL 性能优化神器 Explain 使用分析 What is the

    11.6K21

    为什么我的 Mac 运行缓慢以及如何使用CleanMyMac X修复它

    在本文中,我们将解释 MacBook 运行缓慢的原因,并为您提供十个神奇的修复方法,让您的 MacBook 恢复速度。开始吧! 为什么 Mac 运行缓慢? 浏览器对内存的要求越来越高。...如果您发现 Mac 变热,请先尝试避免阳光直射并正确清洁它。然后继续尝试这些修复。...要了解更多信息,请查看这篇关于 如何从 Mac 中删除病毒和恶意软件的文章。 5.存储没有优化 Apple 开发人员已经预见到 Mac 运行缓慢的问题。...此内存就像是您所有应用程序的燃料。因此,当您收到“您的系统应用程序内存不足”消息时,一种解决方案是付费升级您的 RAM。或者只是使用这个免费的快捷方式。...使用无线诊断。 8.太多未使用的应用程序 由于存储问题,您的 Mac 可能运行缓慢,因此最好检查您是否还有一些可用空间。未使用的应用程序是最大的空间浪费者。

    2.8K30

    玩转Mysql系列 - 第24篇:如何正确的使用索引?

    这是Mysql系列第24篇。 学习索引,主要是写出更快的sql,当我们写sql的时候,需要明确的知道sql为什么会走索引?为什么有些sql不走索引?sql会走那些索引,为什么会这么走?...为什么使用函数了数据就不走索引了? 这些问题可以先放一下,我们先看一下b+树检索数据的过程,这个属于原理的部分,理解了b+树各种数据检索过程,上面的问题就都可以理解了。...通常说的这个查询走索引了是什么意思?...,如果这个过程中不能够确定数据在那些页中,我们认为这种情况下索引对这个查询是无效的,此查询不走索引。...name、id的值,这个查询只用走idx1这一个索引就可以了,如果select后面使用*,还需要一次回表获取sex、email的值。

    2.1K20

    MySQL 为什么要使用索引及索引创建的原则有哪些?

    为什么创建索引 因为索引在一定程度上,提高了数据库查询速度 在MySQL中有两种数据访问方式:顺序访问和索引访问。...索引访问 索引访问顾名思义就是我们在查询数据是在索引数据结构上执行的,索引数据首先是排好序的,其次他没有保存完整的数据列(聚集索引除外,它的完整记录是放在叶子节点中的) 这种访问方式前提是你已经建好索引...,并且你检索的数据列存在索引表中,只有这样你才可以使用索引查询。...哪些情况下需要创建索引 选择唯一性索引:唯一性索引的值是唯一的,可以更快速的通过索引来确定某条记录 为经常需要排序、分组和联合操作的字段建立索引 经常作为查询条件的字段建立索引 尽量使用数据量少的索引,...加快数据的查询速度 可以加速表和表的连接 在查询过程中使用索引,还会触发mysql隐藏的优化器,提高查询性能 缺点 索引的创建和维护需要消耗时间,并且还占据一部分额外的空间,并且随着数据量增大,索引占用的空间也会增大

    40420

    MySQL进阶篇(03):合理的使用索引结构和查询

    一、高性能索引 1、查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的不断变大,解决查询性能的最常见手段是:针对查询的业务场景,设计合理的索引结构...1、单列查询 这里直接查询主键索引,MySQL的主键一般选择自增,所以速度非常快。...通过上面几个查询案例,索引组合索引使用的注意事项如下: 组合索引必须按索引最左列开始查询; 不能跳过组合字段查询,这样无法使用索引; 四、索引其他说明 1、索引的优点 基于注解或唯一索引保证数据库表中数据的唯一性...; 索引通过减少扫描表的行数提高查询的效率; 2、索引的缺点 创建索引和维护索引,会耗费空间和实际; 查询以外的操作增删改等,都需要动态维护索引; 3、索引使用总结 索引机制在MySQL中真的非常复杂,...非专业的DBA(就是指开发人员),基本要熟练常见的索引结构,待过两年所谓的大厂,每个版本开发涉及的核心表SQL都是有专业DBA验收,复杂的查询都是提交需求,DBA直接输出查询SQL,当然在一般公司是没有

    75810

    【深入学习MySQL】MySQL的索引结构为什么使用B+树?

    前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。...本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。...在MySQL中,这里所说的真实数据,可能是行的全部数据(如Innodb的聚簇索引),也可能只是行的主键(如Innodb的辅助索引),或者是行所在的地址(如MyIsam的非聚簇索引)。...这里假设每个叶节点页面存储100条记录(实际上,当索引为聚簇索引时,这个数字可能不足100;当索引为辅助索引时,这个数字可能远大于100;可以根据实际情况进行估算)。...,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。

    87520

    Mysql的索引为什么使用B+树而不使用跳表?

    为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n))。...但问题就来了,查询数据性能在 lg(n) 级别的数据结构有很多,比如redis的zset里用到的跳表,也是lg(n),并且实现还贼简单。 那为什么mysql的索引,不使用跳表呢?...Mysql的索引为什么使用B+树而不使用跳表? B+树是多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息,所以扇出很高。...而针对写操作,B+树需要拆分合并索引数据页,跳表则独立插入,并根据随机函数确定层数,没有旋转和维持平衡的开销,因此跳表的写入性能会比B+树要好。...那为什么要用跳表而不用B+树等结构呢? 这个几乎每次面试都要被问一下。 虽然已经很熟了,但每次都要装作之前没想过,现场思考一下才知道答案。 真的,很考验演技。

    96341

    MySQL 5.7使用or是否会用到索引并提高查询效率的理解

    相信很多人在MySQL中看到了where条件中使用到了or就会以为这样是不会走索引的,通常会使用union all或者in 来进行优化,事实并不是想象的这样具体问题具体分析。...AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified 1.首先我们使用同一列带索引字段的进行查询...2.我们再来看看不同列带索引字段的进行查询 mysql> explain select pad from sbtest1 where  k='501462' or c='68487932199-96439406143...如果or的条件中有个条件不带索引的话,那这条sql就不会使用到索引了,如下。...> 可以看出在多表查询的情况下or条件如果不在同一个表内执行计划表a的查询不走索引。

    2.6K00

    MySQL技能完整学习列表6、查询优化——1、EXPLAIN命令的使用——2、索引优化

    当你前面加上EXPLAIN运行一个SELECT查询时,MySQL返回关于如何执行该查询的信息,而不是查询结果本身。 EXPLAIN的输出列 id: 查询的标识符。...possible_keys和key都是age,这表示MySQL可以并且确实使用了age索引来优化这个查询。 rows是2,这意味着MySQL预计需要检查两行来获取结果。...MySQL索引优化 MySQL的索引优化是提高数据库查询性能的关键步骤之一。正确使用索引可以显著减少查询所需的时间和资源。下面是一些关于MySQL索引优化的详细说明和示例: 1....定期优化索引 定期使用OPTIMIZE TABLE命令来优化表和索引。这个命令可以帮助重新组织表和索引的物理存储,以提高查询性能。...使用EXPLAIN分析查询性能 使用EXPLAIN命令来分析查询的执行计划,查看MySQL是如何使用索引来执行查询的。通过分析EXPLAIN的输出,你可以发现潜在的性能问题,并进行相应的优化。

    24110

    DBA大牛告诉你,如何让MySQL语句执行加速?

    一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?...因为: 数据库出现瓶颈,系统的吞吐量出现访问速度慢 随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长 数据读写速度缓慢 就是咱们说的“性能问题”,程序员一遇到它总是焦头烂额!...通常的方法有两种: 方案一:使用覆盖索引,即查询出的列只是用索引就可以获取,而无须查询表记录,这样也走了索引; 方案二:使用locate函数或者position函数代替like查询,如table.field...如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exist 的子查询依然能用到表上的索引。...这个时候需要有经验的DBA进行判断,选择正确的驱动表,这个时候 straightjoin 就起了作用了,下面我们来看一看使用straight_join进行优化的案例。

    85920

    DBA大牛告诉你,如何让MySQL语句执行加速?

    一打开科技类论坛,最常看到的文章主题就是MySQL性能优化了,为什么要优化呢?...因为: 数据库出现瓶颈,系统的吞吐量出现访问速度慢 随着应用程序的运行,数据库的中的数据会越来越多,处理时间变长 数据读写速度缓慢 就是咱们说的“性能问题”,程序员一遇到它总是焦头烂额!...通常的方法有两种: 方案一:使用覆盖索引,即查询出的列只是用索引就可以获取,而无须查询表记录,这样也走了索引; 方案二:使用locate函数或者position函数代替like查询,如table.field...# not in 和 not exist 如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not exist 的子查询依然能用到表上的索引。...这个时候需要有经验的DBA进行判断,选择正确的驱动表,这个时候 straightjoin 就起了作用了,下面我们来看一看使用straight_join进行优化的案例。

    98530

    面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?

    答案:约2千万 为什么是这么多? 因为这是可以算出来的,要搞清楚这个问题,先从InnoDB索引数据结构、数据组织方式说起。 计算机在存储数据的时候,有最小存储单元,这就好比现金的流通最小单位是一毛。...怎么得到InnoDB主键索引B+树的高度? 上面通过推断得出B+树的高度通常是1-3,下面从另外一个侧面证明这个结论。...关于二级索引与主键索引的区别请参考MySQL相关书籍,本文不在此介绍。...可以看出尽管数据量差异较大,这两个表树的高度都是3 换句话说这两个表通过索引查询效率并没有太大差异,因为都只需要做3次IO。...面试题 有一道MySQL的面试题,为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?

    1.4K30

    ElasticSearch 高亮显示大文档搜索结果的策略和性能对比

    任何使用搜索系统的用户都希望在点击“搜索”按钮后立即得到搜索结果,而不需要等待半分钟就会出现第一个结果。让我们来看看高亮显示这个缓慢突出的问题并解决它。...Fast Vector Highlighting (FVH) - 似乎是最快的,特别是对于大型文档。需要为索引中的每个令牌存储位置偏移量。...最后的选择是FVH,原因如下: 如果使用FVH,一个100Mb的文档高亮显示大约需要10-20毫秒,Postings大约需要一秒钟 Postings并不总是正确地将文档的字段划分为句子,这就是为什么高亮显示的大小会有很大的差异...FVH没有这种问题,因为它检索固定数量的令牌,而不是句子。 Postings以任何顺序突出显示令牌,在复杂查询中不能正常工作。...解决这个问题的办法是短语置换。我们提交不同的查询以搜索和高亮显示,Search获取默认查询,高亮显示通过修改源短语中所有单词位置的变化而构建查询。

    2.3K30

    MySQL“被动”性能优化汇总!

    PS:当遇到性能缓慢下降、或硬件指标缓慢增加的情况,如今天内存的占用率是 50%,明天是 70%,后天是 90% ,并且丝毫没有收回的迹象时,我们应该提早发现并处理此类问题(这种情况也属于被动优化的一种...解决方案 1:创建并正确使用索引 索引是一种能帮助 MySQL 提高查询效率的主要手段,因此一般情况下我们遇到的单条 SQL 性能问题,通常都是由于未创建或为正确使用索引而导致的,所以在遇到单条 SQL...如果表的索引已经创建了,接下来就要检查一下此 SQL 语句是否正常触发了索引查询,如果发生以下情况那么 MySQL 将不能正常的使用索引: 在 where 子句中使用 !...问题 2:部分 SQL 运行慢 问题分析 部分 SQL 运行比较慢,我们首先要做的就是先定位出这些 SQL,然后再看这些 SQL 是否正确创建并使用索引。...默认情况下,MySQL 数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会给 MySQL 服务器带来一定的性能影响。

    61020

    从大厂不允许使用 SELECT * 说开去

    其次如果数据库进行了字段的删除/增加就会造成与 resultMap 不一致进而导致程序报错无法正确运行。...使用 SELECT * 会造成 MySQL 优化器的 覆盖索引 策略失效,这个策略在业内又是被公认为速度和效率都是极好的,那么这样一来这个优秀的策略就无用武之地了。...在这里需要注意的是:我们在开发中辅助索引的数量往往大于聚集索引的数量,那么利用辅助索引去进行查询的时候是从内存中直接读取数据的,聚集索引有时会去读取磁盘这样就出现了拆查询缓慢的问题。...我们不妨先来看看 MySQL 中索引的使用规则,我们可以把索引看成一本词典,name、sex、birthday 分别是这本辞海的字母、字和词,如果我们想要查询字(sex)的时候就需要知道这个字的以什么字母...表数据量很小的情况,建立索引会引起开销增大; 不经常使用的列,在这样的列上建立索引完全没有用; 数据频繁更新的列,建立索引会影响新增和更新的效率; 数据平均分布的列。

    1.1K30

    MySQL EXPLAIN ANALYZE

    但这并不能表明这些估计是否正确,或者查询计划实际上是在哪些操作上花费的时间。EXPLAIN ANALYZE将执行以下操作: ?...这个时间反映了整个子树在执行过滤操作时的根部时间,即,使用索引查找迭代器读取行,然后评估付款日期为2005年8月的时间。...如果我们查看schema,发现payment_date列上没有索引或直方图,因此提供给优化器的统计信息是有限的。如果使用更好的统计信息可以得出更准确的估计值,我们可以再次查看索引查找迭代器。...需要一定的练习,用户才可以分析查询并理解为什么它们表现不佳。但是,这里有一些帮助入门的简单提示: 如果疑惑为何花费这么长时间,请查看时间。执行时间花在哪里?...trace 希望您喜欢这个新功能,EXPLAIN ANALYZE将帮助您分析和了解缓慢的查询。

    1.4K20
    领券