iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL选错索引的原因是什么
  • 111
分享到

MySQL选错索引的原因是什么

2023-07-05 14:07:53 111人浏览 薄情痞子
摘要

本篇内容介绍了“MySQL选错索引的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.引例首先创建一张表,并对字段a,b分别建立索

本篇内容介绍了“MySQL选错索引的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.引例

首先创建一张表,并对字段a,b分别建立索引:

create table t (    id int(11) not null,    a int(11) default null,    b int(11) default null,    primary key (id),    key a(a),    key b(b))engine=InnoDB;

然后往表中,插入十万行数据,值按整数递增:(1,1,1)、(2,2,2)、(3,3,3)…

delimiter ;;create PROCEDURE insertdata()begin declare i int;set i=1;while(i<=100000) DOinsert into t values(i,i,i);set i = i+1;end while;end;;delimiter ;call insertdata();

接下来,我们执行一条sql

Mysql >explain select * from t where a between 10000 and 20000;

执行结果:

MySQL选错索引的原因是什么

结果中的“key”字段就代表了查询中使用的索引。所以这条语句走了索引a,没什么问题。

我们再来执行如下操作:

MySQL选错索引的原因是什么

但是这个时候session B的查询语句select * from t where a between 10000 and 20000就不会再选择索引a。

为了比较使用索引和不使用的查询性能对比,执行下面的语句:

set long_query_time=0;select * from t where a between 10000 and 20000;select * from t force(a) where a between 10000 and 20000;

下面是两种慢查询日志中的结果对比:

MySQL选错索引的原因是什么

第一个查询查找了十万行,第二个查询走了索引,查找了一万行,速度明显比较快。

那为什么会选错索引呢?

2.优化器的逻辑

选择索引是优化器的工作,优化器选择索引的目的,就是想要找到一个最优的执行方案,并用最小的代价去执行。

数据库里面,扫描行数是影响执行代价的因素之一。扫描行数越少,意味着访问磁盘次数越少。但是扫描行数并不是唯一的评价标准,还会考虑临时表,是否排序等因素。

那扫描行数是如何判断的?
MySQL在真正执行之前,只能根据统计信息来估算记录数。这个统计信息就是索引的“区分度”。 一个索引上不同的值越多,这个索引的区分度就越好。而一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好。

我们可以用show index的方法看到不同索引的基数值,但是可以看到统计信息并不是太准确。 可以使用analyze table t来重新统计,但是也不一定准确。

MySQL选错索引的原因是什么

那MySQL是如何得到索引的基数呢?
答案是MySQL会采取采样统计的方法,默认会选择N个数据页,统计这些页面上的不同值,得到平均值,再乘以总的页面数。

mysql中,有两种存储索引统计的方式,可以通过设置innodb_stats_persisten来设置:

  • 设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10

  • 设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是16

我们再来比较两个语句预估的查询行数,如下图:

MySQL选错索引的原因是什么

图中的row字段就代表预估的查询行数。对于第一条语句,预估的查询行数是104620.第二条语句,预估的查询行数是37116。明显第二条语句的查询行数少,那为什么没有选择索引a呢?

这是因为,如果使用索引a,每次从索引a上拿到一个值,都要回表查询。而如果选择扫描十万行的语句,则不需要回表。因此优化器评估这两条语句时,觉得回表查询更耗费时间,所以没有使用索引。但是实际中,这种方式并不是最优的。

3.解决办法

第一种解决办法是和第二条语句一样,采用force index强行选择一个索引。如果force index指定的索引在候选索引列表中,就直接选择这个索引,而不再去评估执行代价。但是这种方式不太优雅,而且改了索引名,语句也要改

第二种解决办法是考虑修改sql语句,引导MySQL使用我们期望的索引

第三种解决办法是新建一个更合适的索引,删除掉误用的索引

“MySQL选错索引的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL选错索引的原因是什么

本文链接: https://www.lsjlt.com/news/352160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL选错索引的原因是什么
    本篇内容介绍了“MySQL选错索引的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.引例首先创建一张表,并对字段a,b分别建立索...
    99+
    2023-07-05
  • mysql索引快的原因是什么
    本篇内容主要讲解“mysql索引快的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql索引快的原因是什么”吧! 索引...
    99+
    2023-04-14
    mysql
  • MySQL的索引机制原因是什么
    MySQL的索引机制原因是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。      ...
    99+
    2024-04-02
  • mysql in索引失效的原因是什么
    这篇“mysql in索引失效的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“m...
    99+
    2023-05-25
    mysql
  • MongoDB 中索引选择B-树的原因是什么
    这期内容当中小编将会给大家带来有关MongoDB 中索引选择B-树的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、B-树和B+树的区别很明显,我们要想弄清楚...
    99+
    2024-04-02
  • MySQL数据库索引选择使用B+树的原因是什么
    这篇文章主要介绍MySQL数据库索引选择使用B+树的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、二叉查找树(1)二叉树简介:二叉查找树也称为有序二叉查找树,满足二叉查...
    99+
    2024-04-02
  • 索引失效的原因是什么
    本篇内容主要讲解“索引失效的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“索引失效的原因是什么”吧!MySQL数据是如何存储的聚集索引我们先建如下的一...
    99+
    2024-04-02
  • MySQL索引失效原因及SQL查询语句不走索引原因是什么
    这篇“MySQL索引失效原因及SQL查询语句不走索引原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我...
    99+
    2023-03-07
    mysql sql
  • mysql中出现索引失效的原因是什么
    这篇文章将为大家详细讲解有关mysql中出现索引失效的原因是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前...
    99+
    2023-06-08
  • mysql要索引的原因
    这篇文章主要介绍了mysql要索引的原因,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。因为索引能够快速提高查询速度;如果不使用索引,mysql必...
    99+
    2024-04-02
  • mongoDB中加索引的原因是什么
    本篇文章给大家分享的是有关mongoDB中加索引的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。为集合加索引mongodb支持内嵌属...
    99+
    2024-04-02
  • MySQL的索引原理是什么
    本篇内容介绍了“MySQL的索引原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、索引的本质索引...
    99+
    2024-04-02
  • MySQL索引的原理是什么
    本篇内容介绍了“MySQL索引的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!索引,可能让好很多...
    99+
    2024-04-02
  • MySQL索引原理是什么
    这篇文章主要介绍MySQL索引原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!摘要: 就一起来聊一聊MySQL索引。 什么是索引? 百度百科是这样描述的: 索引是为来加速对表...
    99+
    2024-04-02
  • MySQL索引提高查询效率的原因是什么
    小编给大家分享一下MySQL索引提高查询效率的原因是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql教程栏目介绍索引提高查询效率的原因。背景我相信大家在数据库优化的时候都会说到索引...
    99+
    2024-04-02
  • 使用MySQL索引的原因
    这篇文章主要介绍使用MySQL索引的原因,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库系统访问数据的两种方式:(1) 顺序访问顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直...
    99+
    2024-04-02
  • mysql索引失效的原因
    小编给大家分享一下mysql索引失效的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!索引对于MySQL而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来...
    99+
    2024-04-02
  • MySQL索引失效的原因及解决方法是什么
    MySQL索引失效的原因可能有以下几种:1. 数据分布不均匀:如果某个列的数据分布不均匀,索引可能无法有效地过滤掉大部分的数据,导致...
    99+
    2023-10-25
    MySQL
  • MySQL中索引提高查询效率的原因是什么
    MySQL中索引提高查询效率的原因是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。磁盘IO和预读:先说一下磁盘IO,磁盘读...
    99+
    2024-04-02
  • MySQL中索引的原理是什么
    这期内容当中小编将会给大家带来有关MySQL中索引的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“m...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作