暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB索引失效案例

原创 言笑 2024-10-18
232

适用范围

MogDB索引失效

问题概述

对于一个一千万条记录的大表(id为主键字段),查询特定的10条记录,优化器误判导致执行计划应走索引却走全表,这种情况往往是由于索引失效,索引失效的情况很多,导致本案例结果的原因是where条件后跟的索引字段输入的数据类型和原先定义的数据类型不匹配导致的,表定义时设置了id字段的数据类型为bigint,但是查询的时候调用了floor()函数对浮点数取整而忽略了返回值虽是整数但是仍为浮点类型。

表结构
image.png

插入千万条记录
image.png

查询id大于9999990.5的记录
image.png
可以看到查询仅仅10条记录,执行计划显示的却是走的全表扫描方式,总耗时1.45秒

问题原因

正常情况下,如果走索引肯定比全表快,那么是什么导致的索引失效呢?其实可以看到,id列的数据类型是bigint整形,但是查询条件是调用了floor()函数去取整,但是floor函数返回的数据并不真正意义上的整形数据(而是numeric浮点类型),数据类型的不匹配导致了优化器认为无法走索引。
image.png

解决方案

在一些特定的情况下,我们初始的查询条件并不一定会和该字段定义的数据类型保持一致从而导致索引失效,这时候就需要用到一些方法去进行类型的转换,在openGauss中,可以使用CAST函数将浮点型数据转换为整型数据。CAST函数用于将一个数据类型转换为另一个数据类型。
image.png
可以看到经过转化数据类型得到了匹配,优化器基于最小cost原则选择了索引扫描的方式,总耗时0.14ms,速度提升近万倍!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论