首页
学习
活动
专区
圈层
工具
发布

用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性

背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行。...rowid 接着拿rowid去做TableRowIDScan扫描每一行数据并进行过滤,得到了0行数据 以上两步组成了一个IndexLookUp回表操作,返回结果交给TiDB节点做Limit,得到0行数据...深入分析 根据经验推断,回表多说明索引效果不好,先看一下这个表的总行数是多少: mysql> select count(1) from job_cm_data; +----------+ | count...对于本文中的SQL而言,首先要从索引中扫描出258733个rowid,再拿这258733个rowid去查原始数据,不仅不能提高查询效率,反而让查询变的更慢了。...mysql> select flag,count(1) from job_cm_data group by flag; +------+----------+ | flag | count(1) | +

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

    信创数据库选型实战:订单管理系统内核架构对比与迁移经验

    说真的,我一度不太看好这条路,因为生态短板太明显。我对比的三款数据库,跑分差不多,但拿到业务SQL上一跑,差异就出来了。存储引擎怎么决定性能,行存列存还是混存存储引擎决定数据怎么存、怎么读、怎么写。...MySQL的InnoDB是行存引擎,一行数据的所有字段存在一起。分析查询需要读所有行的某几个字段时,行存会把整行数据都读出来,丢掉不需要的列。当表有几十个列、查询只需要两三个列时,IO浪费很高。...对比维度MySQL开源改写方案A开源改写方案B自研内核方案C内核路线原生MySQLPostgreSQL二次开发MySQL深度优化完全自研存储引擎InnoDB行存行存+部分列存扩展InnoDB+定制引擎行列混合多模引擎优化器策略统计信息...一条简单的COUNT查询,MySQL选了全表扫描,国产库却走了索引然后回表。我当时坚信走索引应该更快,毕竟索引就是用来加速查询的嘛。结果反而慢了十倍。...有些国产数据库的统计信息采集频率和MySQL不一样,我那次就是数据导入后忘了更新,一条COUNT查询慢了十倍,查了半天才发现是统计信息过期。第三,生态兼容性是隐形成本,要提前评估。

    17710

    如何实现分布式锁?

    分布式的锁 张大胖觉得有点不对劲, 这几天程序执行怎么有点儿慢了呢? 他还以为是机器性能不够,就申请了几台新机器,又安装了几个Tomcat,组成了一个集群。 ?...还得弄一个清理者, 清理那些过期没释放的锁, 这实在是太麻烦了。 Redis 这时候Redis说道:“千万别上MySQL的贼船!他的办法太笨重了,不就是找个第三方来保存锁的信息吗?用我的缓存多好!”...行锁 第二天, MySQL高兴得去找Tomcat:“兄弟们,我昨天晚上和Quartz(一个著名的定时执行框架)聊了半宿,他告诉了我一个新的用数据库实现分布式锁的办法, 行锁。” ?...“自然是阻塞住了,等到别的线程释放了行锁,它可以自动去获取,代码中都不用循环重试,你看,之前的方案都做不到这一点吧。” MySQL说道。 “那要是有个线程迟迟不释放行锁,会发生什么问题?”...product_id=#product_id and stock_num = #old_num MySQL眼前一亮, 是啊,每次把这个#old_num 作为条件传进去调用update语句,如果能成功,

    1.1K60

    MySQL8.4运维实录:3个案例带你吃透MySQL并行查询,大表扫描不再头大

    一、 案例1:电商4200万+行用户表,count(*)从18秒砍到2.3秒 先说个最常见的场景——报表统计的count(*)慢查询。...秒,反而慢了点 后来才想明白,线程数不是越多越好,超过16之后,线程切换的开销就盖过并行收益了。...确定16是最优值后,我改了my.cnf,也用SET PERSIST让参数立即生效(MySQL8.*的新特性,不用重启数据库,这点太香了)。...客户的app_log表存了1.8亿行日志,200GB大小,服务器是64核128GB内存配NVMe SSD,MySQL8.4.5。...客户的tb1表存了8000万行民生数据,80GB大小,服务器是16核32GB内存配SAS硬盘(不是SSD,IO性能偏弱),MySQL8.4.2版本。

    54110

    mysql聚合统计数据查询缓慢优化方案

    sql聚合函数 在mysql等数据中,都会支持聚合函数,方便我们计算数据。...常见的有以下方法 取平均值 AVG() 求和 SUM() 最大值 MAX() 最小值 MIN() 行数 COUNT() 演示几个简单使用的sql语句: 查询u_id为100的订单总数 select...u_id = 100; 查询销量最高的商品 select max(sell_num) from goods 统计7月份的订单数量、金额总和 select count(id) as count, sum(...在这种聚合函数中,结果需要遍历每一条数据来计算,比如我们统计订单总和,就需要每一行都读取订单金额,然后加起来。...此时就会非常慢了。 增加索引并不能解决聚合函数统计慢的问题 优化聚合统计的方案 提前预算 建立统计数据表,以日期区分,如:20190801一天,销售了多少订单、金额等等数据。

    7.8K30

    Mysql中MyISAM引擎和InnoDB引擎的比较

    结论 如果不清楚自己应该用什么引擎,那么请选择InnoDB,Mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的引擎是MyISAM ---- MyISAM 和 InnoDB的适用场景...---- 使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都会看到。 MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB了。...COUNT without WHERE MyISAM更优。...因为MyISAM保存了表的具体行数 InnoDB没有保存表的具体行数,需要逐行扫描统计,就很慢了 COUNT with WHERE 一样 一样,InnoDB也会锁表 锁 只支持表锁 支持表锁、行锁 行锁大幅度提高了多用户并发操作的新能...因为MyISAM保存了表的具体行数 InnoDB没有保存表的具体行数,需要逐行扫描统计,就很慢了 COUNT with WHERE 一样 一样,InnoDB也会锁表 锁 只支持表锁 支持表锁、行锁

    2.1K60

    mysql 优化面试题

    第二方面: select Count (*)和Select Count(1)以及Select Count(column)区别 一般情况下,Select Count (*)和Select Count(1)...特点: · 行锁设计、支持外键,支持事务,支持并发,锁粒度是支持mvcc得行级锁;  MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing...操作速度快,不能读写操作太频繁;  27、 解释MySQL外连接、内连接与自连接的区别 先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配...缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 9. 如何通俗地理解三个范式?  ...InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。 20. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? a.

    93540

    看一遍就理解:group by详解

    判断临时表中是否有为 city='X'的行,没有就插入一个记录 (X,1); 如果临时表中有city='X'的行的行,就将x 这一行的num值加 1; 遍历完成后,再根据字段city做排序,得到结果集返回给客户端...X'的行,没有就插入一个记录 (X,1); 如果临时表中有city='X'的行的行,就将x 这一行的num值加 1; 继续重复2,3步骤,找到所有满足条件的数据, 最后根据字段city做排序,得到结果集返回给客户端...比如这个SQL: select city ,count(*) as num from staff where age> 19 group by city having num >= 3; 执行where...count() 数量 sum() 总和 avg() 平均 max() 最大值 min() 最小值 如果没有配合聚合函数使用可以吗? 我用的是Mysql 5.7 ,是可以的。...MySQl优化器发现,磁盘临时表是B+树存储,存储效率不如数组来得高。

    7.1K51

    性能大PK count(*)、count(1)和count(列)

    最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,说到以下内容: 你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,用 count(1),这样比较快...MySQL 对 count(*) 的优化 其实,MySQL 在执行 count(*) 操作的时候还是做了优化的。...count(主键id) InnoDB引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。...count(1) 会统计表中的所有的记录数,包含字段为 null 的记录。 同样遍历整张表,但不取值,server 层对返回的每一行,放一个数字1进去,判断是不可能为空的,按行累加。...count(*) 需要注意的是,并不是带了 * 就把所有值取出来,而是 MySQL 做了专门的优化,count(*) 肯定不是null,按行累加。

    2.4K10

    一次线上MySQL分页事故,搞了半夜...

    点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 文章来源:【公众号:JAVA日知录】 目录 背景 分析 数据模拟 测试 解决方案 小结 今天给大家分享个生产事故,一个由于 MySQL...果然,沟通的情况是线上的一个查询数据的接口被疯狂的失去理智般的调用,这个操作直接导致线上的 MySQL 集群被拖慢了。...这太神奇了,而且我们页面上的分页单页数量也不是 500,而是 25 条每页,这个绝对不是人为的在功能页面上进行一页一页的翻页操作,而是数据被刷了(说明下,我们生产环境数据有 1 亿+)。...大家翻看《高性能 MySQL》第六章:查询性能优化,对这个问题有过说明:分页操作通常会使用 limit 加上偏移量的办法实现,同时再加上合适的 order by 子句。...但这会出现一个常见问题:当偏移量非常大的时候,它会导致 MySQL 扫描大量不需要的行然后再抛弃掉。 数据模拟 那好,了解了问题的原理,那就要试着解决它了。

    58920

    MySQL(五)汇总和分组数据

    ; 2、count()函数 count()函数进行计数,可利用count()确定表中行的数目或符合特定条件的行的数目; count()函数有两种使用方式: ①使用count(*)对表中行的数目进行计数,...不管表列中包含的是空值(null)还是非空值; ②使用count(column)对特定列中具有值的行进行计数,忽略null值; select count(*) as num_cust from customers...; 这条SQL语句利用count(*)对customers表中所有行计数,计数值在num_cust中返回; select count(cust_email) as cum_cust from customers...6、distinct与聚集函数 MySQL5.0.3以及之后的版本,聚集函数和distinct可以搭配使用,比如: ①对所有的行执行计算,指定all参数或不给参数(all是默认所有行为,不需要指定,如果不指定...二、分组数据 1、group by创建分组 在MySQL中,分组是在select语句中的group by子句中建立的,比如: select vend-id,count(*) as num_prods from

    7K20

    一次深夜优化 MySQL 亿级数据分页的奇妙经历!

    果然,沟通的情况是线上的一个查询数据的接口被疯狂的失去理智般的调用,这个操作直接导致线上的MySql集群被拖慢了。...这太神奇了,而且我们页面上的分页单页数量也不是500,而是 25条每页,这个绝对不是人为的在功能页面上进行一页一页的翻页操作,而是数据被刷了(说明下,我们生产环境数据有1亿+)。...02 分析 其实对于我们的MySQL查询语句来说,整体效率还是可以的,该有的联表查询优化都有,该简略的查询内容也有,关键条件字段和排序字段该有的索引也都在,问题在于他一页一页的分页去查询,查到越后面的页数...大家翻看《高性能MySQL》第六章:查询性能优化,对这个问题有过说明: 分页操作通常会使用limit加上偏移量的办法实现,同时再加上合适的order by子句。...但这会出现一个常见问题:当偏移量非常大的时候,它会导致MySQL扫描大量不需要的行然后再抛弃掉。 03 数据模拟 那好,了解了问题的原理,那就要试着解决它了。

    65720
    领券