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

当我添加新索引时,为什么MySQL中索引的基数保持不变?

当您在MySQL中添加新索引时,索引的基数保持不变,是因为在添加新索引时,MySQL会自动更新统计信息,以便优化查询计划。在这个过程中,基数是指索引中不同值的数量。基数的变化可能会影响查询的性能,因此在添加新索引时,MySQL会尽量保持基数不变,以减少查询计划的更改。

如果您希望手动更新基数,可以使用ANALYZE TABLE命令来强制MySQL更新统计信息。这将重新计算基数,并可能影响查询计划的优化。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你知道MySQL 8.0索引有哪些特性吗?看这一篇就够了!!!

在之前MySQL版本,只能通过显式方式删除索引,如果删除后发现索引删错了,又只能通过创建索引方式将删除索引添加回来,如果数据库数据量非常大,或者表比较大,这种操作成本非常高。...在MySQL 8.0,只需要将这个索引先设置为隐藏索引,使查询优化器不再使用这个索引,但是,此时这个索引还是需要MySQL后台进行维护,当确认将这个索引设置为隐藏索引系统不会受到影响,再将索引彻底删除...(6)使隐藏索引对优化器可见 在MySQL 8.x 中提供了一种测试方式,可以通过优化器一个开关来打开某个设置,使隐藏索引对查询优化器可见。 查看查询优化器开关,如下所示。...接下来,在t3表添加一列c3,模拟c2上函数索引,如下所示。...如果想模拟函数索引效果,则可以使用如下方式。 首先,在c3列上添加索引,如下所示。

1.2K20

MySQL为什么有时候会选错索引

// MySQL为什么有时候会选错索引?...今天分享内容是MySQL为什么有时候会选错索引? 先给出一个结论:在一些不断删除历史数据和新增数据场景下,MySQL会出现选错索引情况。...MySQL优化器是负责选择一个最优执行方案去执行一个SQL,某个SQL在执行过程,扫描行数越少,那么这个SQL执行效率就越高。当表中有多个索引,应用每个索引需要扫描行数都是不同。...我们知道,索引基数决定了索引使用效果,当索引基数较大索引区分度比较高,扫描行数会比较少。那么MySQL究竟是如何获得一个表索引统计信息?...MySQL在采样统计时候,会默认选择N个数据页,然后统计这个数据页上不同值个数,然后取平均值,再乘以这个索引总数据页数量,就得到了索引基数,这个基数是个估计值,不准确。

1.2K30
  • 优化时间序列应用程序数据查询

    ,我们已经遇到了挑战。...无论您使用时间序列数据库是基于Cassandra还是MySQL或其独特体系结构,索引都会影响您查询。...实质上,索引是一个数据结构,它存储来自特定列值,这意味着当我们通过索引字段进行搜索,我们有一个方便快捷方式来访问这些值。...当我们通过未加索引字段进行搜索,我们必须发现找到该值完整路径,没有任何捷径。搜索未加索引字段就像不得不观看《魔戒》 Frodo走过没有标记中土世界:这需要很长时间。...这里时间序列问题是没有关于哪些片段应该被索引约定,所以我们需要随时注意我们模式。 查询范围 当一个查询结果让我失望,我通常跳入命令行。当我第一次发现时间序列数据库,我就是这么做

    89980

    mysql为什么选错索引?怎么解决?

    mysql为什么选错索引? 在进行慢SQL分析时候,有时候我们会发现explain扫描行数和慢日志行数相差很大,那explainrows这个扫描行数是怎么判断?...也就是说,这个基数越高,索引区分度越好。 日常我们可以通过”show index from tablename”看到一个索引基数MySQL怎样得到索引基数?...Mysql是通过采样统计方法。为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确结果,但是代价太高了,所以只能选择“采样统计”。...采样统计时候,InnoDB默认会选择N个数据页,统计这些页面上不同值,得到一个平均值,然后乘以这个索引页面数,就得到了这个索引基数。 而数据表是会持续更新索引统计信息也不会固定不变。...在MySQL,有两种存储索引方式,可以通过设置参数innodb_stats_persistent值来选择: 当设置为on时候,表示统计信息会持久化存储。这时,默认N是20,M是10.

    49110

    一条SQL语句执行得很慢原因盘点

    前言 说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...所以一篇文章肯定是讲不完,我这篇文章,更多是在分析“为什么”,例如可能你知道系统会选错索引,但是可能不并不清楚系统选择索引原理。...如果想搞清楚后者,可以点击领取我整理MySQL学习笔记,我在里面有详细论述。 好了,说回正题! 之前腾讯面试实话,也问到这个问题了,不过答很不好,之前没去想过相关原因,导致一之间扯不出来。...数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。

    88110

    腾讯面试:一条SQL语句执行得很慢原因有哪些?---不看后悔系列

    说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...1、数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。...(2)、数据库选错了索引。 热门内容: 1、Java注解是如何工作? 2、mybatis-plus支持分布式事务了?

    69920

    MySQL史上最全性能优化方式

    MySQL有哪些性能优化方式?这个问题可以涉及到 MySQL 很多核心知识,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...数据库在刷新脏页(flush) 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...内存不够用了:如果一次查询较多数据,恰好碰到所查数据页不在内存,需要申请内存,而此时恰好内存不足时候就需要淘汰一部分内存数据页,如果是干净页,就直接释放,如果恰好是脏页就需要刷脏页。...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引,这也可能是 SQL 执行很慢一个原因。 下面做一个总结。

    76431

    腾讯面试:一条SQL语句执行得很慢原因有哪些?

    说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...1、大多数情况是正常,只是偶尔会出现很慢情况。 2、在数据量不变情况下,这条SQL语句一直以来都执行很慢。 针对这两种情况,我们来分析下可能是哪些原因导致。...数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。

    1.3K00

    为什么我这条SQL执行那么慢?

    说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...1、大多数情况是正常,只是偶尔会出现很慢情况。 2、在数据量不变情况下,这条SQL语句一直以来都执行很慢。 针对这两种情况,我们来分析下可能是哪些原因导致。...1、数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。

    54620

    腾讯面试:一条SQL语句执行得很慢原因有哪些?

    本文作者:帅地 公众号:苦逼码农 说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了...1、大多数情况是正常,只是偶尔会出现很慢情况。 2、在数据量不变情况下,这条SQL语句一直以来都执行很慢。 针对这两种情况,我们来分析下可能是哪些原因导致。...1、数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。

    40410

    腾讯面试:一条SQL语句执行得很慢原因有哪些?---不看后悔系列

    说实话,这个问题可以涉及到 MySQL 很多核心知识,可以扯出一大堆,就像要考你计算机网络知识,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。...1、大多数情况是正常,只是偶尔会出现很慢情况。 2、在数据量不变情况下,这条SQL语句一直以来都执行很慢。 针对这两种情况,我们来分析下可能是哪些原因导致。...1、数据库在刷新脏页我也无奈啊 当我们要往数据库插入一条数据、或者要更新一条数据时候,我们知道数据库会在内存把对应字段数据更新了,但是更新之后,这些更新字段并不会马上同步持久化到磁盘中去,而是把这些更新记录写入到...为什么会这样呢? 其实是这样,系统在执行这条语句时候,会进行预测:究竟是走 c 索引扫描行数少,还是直接扫描全表扫描行数少呢?...既然会预测错索引基数,这也意味着,当我查询语句有多个索引时候,系统有可能也会选错索引哦,这也可能是 SQL 执行很慢一个原因。

    50030

    深入理解MySQL8.0直方图

    先了解一下MySQL里 ANALYZE命令到底有什么用。 ANALYZE 在MySQL里提交一条查询SQL语句,优化器会选在一个最优执行方案,并用最小代价去执行语句。...采样统计时候InnoDB 默认会选择 N 个数据页,统计这些页面上不同值,得到一个平均值,然后乘以这个索引页面数,就得到了这个索引基数。而数据表是会持续更新索引统计信息也不会固定不变。...上面是2次,ANALYZE TABLE命令进行修复索引。在不停浮动。 分析表通过对每个索引树执行随机潜水并相应地更新索引基数估计值来确定索引基数,所以这个值也不是100%准确。...因此,索引数量较多,或者表分区数量较多时,可能会比较费时,要评估代价,并默认只在负载低谷执行。...DROP DATABASE删除被删除数据库任何表直方图,因为该语句删除了数据库所有表。 重命名表不会移除直方图。相反,它将重命名重命名表直方图,使之与表名相关联。

    1.3K20

    MySQL为什么会选错索引

    显然,一个索引上不同值越多,这个索引区分度就越好。而一个索引上不同个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引区分度越好。...那么,MySQL 是怎样得到索引基数呢?这里,我给你简单介绍一下 MySQL 采样统计方法。为什么要采样统计呢?...采样统计时候,InnoDB 默认会选择 N 个数据页,统计这些页面上不同值,得到一个平均值,然后乘以这个索引页面数,就得到了这个索引基数。而数据表是会持续更新索引统计信息也不会固定不变。...MySQL 会根据词法解析结果分析出可能可以使用索引作为候选项,然后在候选列表依次判断每个索引需要扫描多少行。...如果 force index 指定索引在候选索引列表,就直接选择这个索引,不再评估其他索引执行代价。 可以考虑修改语句,引导 MySQL 使用我们期望索引。语义逻辑是相同

    98220

    Mysql索引原理(十六)」维护索引和表-更新索引统计信息

    MyISAM将索引统计信息存储在磁盘, ANALYZE TABLE需要进行一次全索引扫描来计算索引基数。在整个过程需要锁表。...可以使用 SHOW INDEX FR0M命令来查看索引基数( Cardinality)。例如 mysql> SHOW INDEX FROM people ?...image.png 这个命令输出了很多关于索引信息,在MySQL手册对上面每个字段含义都有详细解释。...如果想要更稳定执行计划,并在系统重启后更快地生成这些统计信息,那么可以使用系统表来持久化这些索引统计信息。甚至还可以在不同机器间迁移索引统计信息,这样环境启动就无须再收集这些数据。...一旦关闭索引统计信息自动更新,那么就需要周期性地使用ANALYZE TABLE来手动更新。否则,索引统计信息就会永远不变。如果数据分布发生大变,可能会出现一些很糟糕执行计划。

    2K40

    什么是 MySQL 索引?

    一个好数据库表设计,从一开始就应该考虑添加索引,而不是到最后发现慢SQL了,影响业务了才来补救。其实我在工作经历当中,由于新建表或加字段后,忘记添加索引也造成了多次生产事故,记忆犹新!!!...问题来了:即然不管读还是写,Hash这种类型比Tree树这种类型都要更快一些,那为什么MySQL开发者既使用Hash类型做为索引,又使用了BTREE呢?...如果对A、B、C做复合索引,则它cardinality基数值为8 当有多个索引可用时,mysql会自动依据cardinality大值来进行SQL索引选择优化。...索引基数更加准确一些了。 索引类型 MySQL中有以下索引类型: UNIQUE唯一索引索引其含义是被标定义唯一索引列,不允许出现重复数据, 但可以有NULL值。...,查询语句远远大于DML语句,为一个大表(比如千万级数据)新建索引是一个需要特别慎重事情,经常出现“翻车”导致“车毁人亡”事故,为什么

    1.3K10

    为什么 ElasticSearch 比 MySQL 更适合复杂条件搜索

    ElasticSearch 索引 Index 类似于 MySQL 数据库 Database; ElasticSearch 类型 Type 类似于 MySQL 表 Table;需要注意,这个概念在...,这个Filed 就类似于 MySQL Column; ElasticSearch 映射 Mapping 是对索引索引字段及其数据类型进行定义,类似于关系型数据库表结构 Schema;...不过只看定义,我是有点迷惑,这不是和 MySQL 非主键索引类似嘛,为什么要叫它“倒排”呢?这个问题我目前也为搞清楚,可能要等到后续了解了其具体实现才能理解。...一般 Term 都是按照顺序排序,比如 Author 名称就是按照字母序进行了排序,排序之后,当我们搜索某一个 Term ,就不需要从头遍历,而是采用二分查找。...基数小于 2 ^ 12 次方即 4096,使用unsigned short类型有序数组来存储,最大消耗空间就是 8 KB。

    2.6K21

    为什么ElasticSearch比MySQL更适合全文索引

    image.png ElasticSearch 索引 Index 类似于 MySQL 数据库 Database; ElasticSearch 类型 Type 类似于 MySQL 表 Table...Filed 组成,这个Filed 就类似于 MySQL Column; ElasticSearch 映射 Mapping 是对索引索引字段及其数据类型进行定义,类似于关系型数据库表结构...不过只看定义,我是有点迷惑,这不是和 MySQL 非主键索引类似嘛,为什么要叫它“倒排”呢?这个问题我目前也为搞清楚,可能要等到后续了解了其具体实现才能理解。...image.png 一般 Term 都是按照顺序排序,比如 Author 名称就是按照字母序进行了排序,排序之后,当我们搜索某一个 Term ,就不需要从头遍历,而是采用二分查找。...基数小于 2 ^ 12 次方即 4096,使用unsigned short类型有序数组来存储,最大消耗空间就是 8 KB。

    1.4K12

    MySQL 学习笔记【索引篇】

    当我们执行一条SQL命令通过主键ID 查询一条数据,直接将查到数据返回。但是当执行一条语句查到是普通索引,就需要拿到这条数据主键索引值,然后再去主键索引上查一遍,拿到数据。...然后,当我们使用联合索引,假设我们索引为 (UID,NAME,AGE),而我们要查数据点为(UID,NAME),就不会触发回表,因为当前索引数据已经包含我们要查询数据点,不需要再去主键索引查找...覆盖索引使我们常用优化方案之一,但是覆盖索引也是有代价:需要占用更多数据存储空间,会增加维护成本。 同样当我们在使用联合索引,通常要遵循最左前缀原则。...相反,当一个数据页被删除掉很多数据,也会触发页合并,过程相当于分裂逆流程。 此处会引出一个问题:为什么innodb引擎表一定要有一个自增主键ID?...当我们随机向聚簇索引写入数据,此时每次都要先找到他头部数据点,然后插入数据,再把尾部数据一次向后移动,开销极大。

    915101

    mysql索引十连问| 剑指offer - mysql

    以下是结合网上及此前面试遇到一些关于 mysql 索引面试题。...使用非主键索引,先从非主键索引获取到行对应主键 ID,之后再根据 id 在主键索引树上搜索对应行数据,这个过程也被称为回表。 一般使用什么字段作为主键,为什么?...上面查询条件,a 定值,b 是有序;b 定值,c 是有序;c 范围查询,剩下 d 是无序。所以 d 无法使用到该索引基数小,区分度低不适合创建索引。...比如性别,最多基数最多总共就 3 个,此时索引过滤性能不高,查完索引后还需回表,可能比直接全表扫描效率更低。 更新频繁字段创建索引要权衡索引维护成本。...往数组中间位置添加数据,需要移动后面的数据位置。 B 树:b 树在非叶子节点上也存储数据,在遍历数据,需要对不同层级节点上数据进行拼接和排序,这会导致多次磁盘 io。查询效率较低。

    90220

    技术分享 | 常见索引问题处理

    覆盖索引可以减少树搜索次数,显著提升查询性能,是常用性能优化手段。 但是,维护索引是有代价,所以在建立冗余索引来支持覆盖索引要权衡利弊。...而 MySQL 5.6 引入索引下推优化(index condition pushdown),可以在索引遍历过程,对索引包含字段先做判断,直接过滤掉不满足条件记录,减少回表次数。...修改应用,将应用传入字符类型改为与表结构相同类型。 3. 为什么会选错索引 3.1 优化器 选择索引是优化器工作,其目的是找到一个最优执行方案,用最小代价去执行语句。...显然,一个索引上不同值越多,索引区分度就越好,而一个索引上不同值个数我们称为“基数”,也就是说,这个基数越大,索引区分度越好。...而数据表是会持续更新索引统计信息也不会固定不变。所以,当变更数据行数超过 1/M 时候,会自动触发重新做一次索引统计。

    46130
    领券