sqlite 使用distinct时组合索引可能不是你想的那样

news2024/12/23 19:17:30

目录

    • 先来唠唠嗑吧~
    • 那一探究竟吧!
      • 表结构及索引信息
      • 我的查询场景
      • 到底命中什么索引了?
    • 简单小结下~

先来唠唠嗑吧~

在使用sqlite作为词条数据库查询数据,发现有的sql执行很快,有的sql执行很慢,你以为是没有走索引吗?不一定哦,可能是因为没有走那个区分度很大的索引!!!

那一探究竟吧!

众所周知,sqlite组合索引也是基于二分查询+索引表的,所以使用索引的时候,尽可能的区分度大,这样能更快的在索引表进行定位,然后拿着rowid去表里面定位数据。

表结构及索引信息

在一张表里面,我们可能会有很多索引,本次案例就是如此。如下,是我的表结构及索引信息

create table words
(
    nid        bigint(20) not null,
    key        varchar(500) default '' not null,
    enabled    tinyint(1)   default '1' not null,
    tag        varchar(255) default '' not null,
    sort       varchar(255) default '0' not null,
    parentId   varchar(255) default '0' not null,
    isFrontend tinyint(1)   default '1' not null,
    value      varchar(255) default '' not null,
    npid       bigint(20)   default '0' not null,
    language   varchar(128) default '' not null,
    trans      mediumtext,
    primary key (nid, language)
);

create index words_npid_isFrontend_index
    on words (npid, isFrontend);

create index words_npid_key_language_index
    on words (npid, key, language);

create index words_npid_parentId_index
    on words (npid, parentId);

create index words_value_tag_npid_language_index
    on words (value, tag, npid, language);


我的查询场景

根据tag、value、npid查询key的信息,于是我使用了这个语句:

select distinct key from words where value = 11 and tag = 'atrr_id' and npid = 11

到底命中什么索引了?

按照常规思路,我会根据where语句定位命中的索引,即预测是命中:words_value_tag_npid_language_index
但事实上命中了什么呢?执行下explain,看看命中了什么索引:

explain query plan select distinct key from words where value = 11 and tag = 'atrr_id' and npid = 11

在这里插入图片描述
的确和我预测的不一样呀,为什么呢?
我就想着先简化下sql语句试试,于是把distinct key直接换成了*

explain query plan select * from words where value = 11 and tag = 'atrr_id' and npid = 11

在这里插入图片描述
这下居然和我预测的索引一样诶
我再试试只查key结果呢:

explain query plan select key from words where value = 11 and tag = 'atrr_id' and npid = 11

在这里插入图片描述
还是和我预测的一样。
所以我怀疑distinct关键字,在sqlite数据库使用时,应该和mysql不一样,它会优先命中distinct后面字段的相关索引
所以我把key相关的索引删掉,再执行有distinct的语句:

explain query plan select distinct key from words where value = 11 and tag = 'atrr_id' and npid = 11

在这里插入图片描述
这下即便使用distinct关键字也能正常命中索引了!

简单小结下~

在sqlite数据库使用时,和mysql不一样,它会优先命中distinct后面字段的相关索引,如果distinct字段没有相关索引,才会走where语句相关索引!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出进程控制

文章目录进程控制浅谈fork写时拷贝fork调用失败的原因进程终止进程退出的场景进程常见退出方法查看进程退出码echo $? :查看进程退出码exit和_exit进程等待进程等待的方法waitwaitpid获取子进程status宏定义查看进程是否正常退出,查看退出码再谈僵尸进程浅谈阻塞等…

基于.Net Core开发的支付SDK,简化支付功能开发

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 在我们做项目中,不管是电商系统、外卖系统、还是上门维修系统等等,都需要支付功能,这就需要我们与第三方支付平台进行对接,但是第三方平台文档,往往都存…

05语法分析——自下而上分析

文章目录一、自下而上分析基本问题二、算符优先分析构造FIRSTVT(P)的算法构造LASTVT(P)的算法构造优先表的算法三、LR分析法1.LR(0)构造LR(0)项目集规范族构造识别活前缀的DFA构造LR(0)分析表2.SLRSLR解决冲突办法SLR(1)分析表的构造算法3.LR(1)【规范LR】LR(1)项目集I的闭包状…

【MySQL基础】运算符及相关函数详解

序号系列文章3【MySQL基础】MySQL基本数据类型4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解文章目录前言MySQL运算符1,算术运算符1.1,算术运算符的基本使用1.2,常用数学函数的基本使用2…

iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕

本文字数:3046字预计阅读时间:15 分钟iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕笔者之前发表的音视频文章,有图像的处理,音频的重采样等等,都属于入门级别。通过阅读它们,读者能对音视频有…

【复习 自用】JavaScript知识汇总(DOM)

注:之前学过JavaScript,本贴仅用于复习(自用),建议没基础的朋友先学基础。会混入typescript! 更新中~~~~~ Dom核心内容 创建节点 ① document.write() 是直接将内容写入页面的内容流,但是文档流执行完毕&#xff0c…

云原生技能树-docker caontainer 操作

运行 一个Docker镜像(image)运行后,就是一个容器实例,称为container 以镜像hello-world为例,启动容器: docker container run -it hello-world 可以看到输出了Hello World 信息: 以下描述错误的是? 答…

数字逻辑理论——从卡诺图到门电路

卡诺图化简 卡诺图化简 第一步:在卡诺图中圈出相邻为1的小方格(方格的个数为2m2^{m}2m),圈里面的1越多越好,并且这个小方格可以重复使用。 第二步:上一步中的方格或者圈出来的方框——每一个都代表一个与…

Linux软件安装及管理程序

Linux安装及管理程序Linux软件安装及管理程序一、Linux应用程序基础二、RPM软件包管理工具2.1、RPM介绍2.2、RPM命令三、源码编译安装四、yum安装Linux软件安装及管理程序 一、Linux应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置般在/bin和/sbin目录…

linux系统中实现智能家居的基本方法

大家好,今天主要和大家分享一下,智能家居物联网的基本实现与操作方法。 目录 第一:智能家居基本简介 第二:测试WIFI模块功能 第三:智能家居物联UI界面开发 第四:核心代码的具体实现 第五:最…

【阅读笔记】《重构》 第三四章

第三章 代码的味道 DuplicatedCode(重复代码) 同一个类的两个函数含有相同的表达式两个互为兄弟的子类含有相同表达式两个毫不相干的类出现重复代码 LongMethod(过长函数) 函数不宜过长,函数越长越难理解如果想利用单个类做太多事情,其内往往就会出现…

联合证券|港股再融资“春江水暖” 资本争购热门赛道企业

进入2023年,港股再融资商场有所回暖。到1月18日,已有27家港股上市公司发布拟配售股份(简称“配股”)再融资,募资总额164.01亿港元,较上一年同期增加148.16%。其间,微盟集团的配股再融资吸引了众…

fpga实操训练(lcd测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们测试过vga输出,当时是找了一个老式的显示器来完成的,也就是本身自带vga接口的显示器。但是,现在市面上大部分显示器都是默认支持hdmi接口的。所以说,如果真的想用fpga测…

都说InnoDB好,那还要不要使用Memory引擎?

我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行;而使用磁盘临时表得到的结果里,0 这个值在第一行? 今天我们就来看看,出现这个问题的原因吧。 内存表的数据组织结构 为了便于分…

如何在SpringBoot项目中访问静态资源

在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置 1.在项目的application.yml文件中做如下配置 spring:profiles:active: devmvc:view:prefix: /suffix: .html 重点在 配置后生成为WebMvcProperties 配置类。该配置类中有一个内部类View Conf…

各式各样图标的特点

笔者近期在翻看各种样式的图标,逛了下 Iconfont、IconFinder 等图标网站,现根据自己的经验,总结了一些图标特点的描述用语 线性/面性/线面组合平面/立体无层次感(或阴影)/有层次感(或阴影)无填…

Oracle强制加了hint实效三种连接方式使用场合判断

开发写了一个语句使用了connect by level函数 SELECT DISTINCT CTMID FROM ( SELECT CTMID, REGEXP_SUBSTR(FLTUSERIDSTR, ‘[^;]’, 1, l) AS userid FROM s_userinfo,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<300) b WHERE l < LENGTH(FLTUSERIDSTR) - LENGTH(rege…

链表的算法题

目录 题型一、克隆含有rand指针的链表 笔试&#xff1a;哈希表 面试&#xff1a;不用容器&#xff0c;模拟哈希表的功能 题型二、给一个单链表头节点Head&#xff0c;判断是否构成回文 题型三、将单链表按某值划分为左边小&#xff0c;中间相等&#xff0c;右边大 6个变量…

Allegro如何设置创建Pin Pair的快捷键操作指导

Allegro如何设置创建Pin Pair的快捷键操作指导 在做PCB设计的时候需要做一组信号的等长,需要使用到创建Pin Pair的功能,如下图,如果每个网络都右键去选择添加比较浪费时间,如下图 Allegro支持给创建一个Create Pin Pair的快捷键位 具体操作如下 打开规则管理器选择Tools

单调栈与单调队列

单调栈与单调队列一、单调栈1.1 思路1.2 例题&#xff1a;单调栈二、单调队列2.1 思路2.2 例题&#xff1a;滑动窗口一、单调栈 1.1 思路 单调栈主要解决以下问题&#xff1a; 1️⃣ 寻找下一个更大元素 2️⃣ 寻找前一个更大元素 3️⃣ 寻找下一个更小元素 4️⃣ 寻找前一个…