首页 > 其他分享 >索引

索引

时间:2024-08-21 16:04:03浏览次数:9  
标签:index eqp create 索引 type id

场景

不废话直接建表:

create table t_log
(
    id                 bigint auto_increment comment '主键id'
        primary key,
    user_id            bigint                                 null comment '用户ID',
    eqp_number         varchar(255)                           null comment '设备号',
    type               char         default '1'               null comment '日志类型 0离线 1上线',
    title              varchar(255) default ''                null comment '日志标题',
    remote_addr        varchar(255)                           null comment '操作IP地址',
    current_project_id bigint                                 not null comment '当前项目ID',
    root_project_id    bigint                                 not null comment '根项目ID',
    create_time        datetime     default CURRENT_TIMESTAMP null comment '创建时间',
    eqp_name           varchar(50)                            null comment '设备名称',
    eqp_model          varchar(50)                            null comment '设备型号',
    eqp_major_type     varchar(5)                             null comment '设备大类1:微断主机;2';

)
    comment '日志' row_format = DYNAMIC;

现在有一个需求是需要根据项目类型(eqp_major_type) 和当前项目id(current_project_id)去查询且需要按着创建时间排序以10个分页。

OK

SELECT a.current_project_id AS projectId, a.eqp_name, a.eqp_model, a.eqp_number, a.type, a.create_time
FROM t_eqp_log a
WHERE a.current_project_id in (176)
and a.eqp_major_type = 1
order by a.create_time desc
LIMIT 10;

easy啊。

时间久了数据量变大 查询变慢了,leader: 那个谁,你去把这个接口sql优化一下

你看都没看直接加上索引

create index t_eqp_log_create_time_index
    on t_eqp_log (create_time);

create index t_eqp_log_current_project_id_index
    on t_eqp_log (current_project_id);

create index t_eqp_log_eqp_major_type_index
    on t_eqp_log (eqp_major_type);

条件字段都加上不就得了吗

但是image-20240820142410449

目标索引只有createtime被击中, 其他两个字段都没生效,

不对劲啊 (开始Google GPT

image-20240820143102009

一句话总结就是说mysql优化器认为通过create_time索引效率更高,也就是三个字段都没有索引的情况,create_time字段查询的成本会更高,so嘎 那怎么解决呢。很简单啊 直接联合索引啊

create index t_eqp_log_current_project_id_eqp_major_type_create_time_index
    on t_eqp_log (create_time, current_project_id, eqp_major_type);

再次执行一下 不出意外就要出意外了 果然又没生效

分析分析再分析

image-20240820143959485

怎么这行sql越看越不对劲呢。淦 eqp_major_type是string类型的 也就是 eqp_major_type = 1 是存在一个强转的过程

强转就会导致联合索引失效 服了 继续再来

image-20240820152013252

等会 有点对劲啊 赶紧看看文档

image-20240820152255452

官方文档这大一堆 总结就一句话。index是全索引扫描 效率不如range 且重点:

性能从最好到最差:null > system > const > eq_ref > ref > range > index > all

继续看看extra

image-20240820153025707

image-20240821103523425总结一下就是说这次执行情况为:index 类型意味着 MySQL 使用了全索引扫描,尽管联合索引被使用,但可能在过滤上不如 range 类型有效。Backward index scan 表示它在倒序扫描整个索引,这种扫描方式效率相对低。

这时候突然有灵感,既然选择了联合查询肯定要考虑最左前导列原则啊,create_time作为第一导列 但是where条件却没有,也就是没法用它很好的利用where条件来过滤大部分数据,自然会选择全索引扫描 赶紧试试验证一下

image-20240820154917360

h h h 果然皇天不负

标签:index,eqp,create,索引,type,id
From: https://www.cnblogs.com/mondayishard/p/18371881

相关文章

  • MySQL 禁止使用 HASH 索引
    在MySQL中,虽然InnoDB存储引擎默认使用的是BTREE索引,但它也支持一种特殊的自适应哈希索引(adaptivehashindex,AHI),这是InnoDB自动管理和使用的,用户无法直接控制。然而,对于内存存储引擎MEMORY(之前称为HEAP),MySQL确实允许用户显式地创建HASH索引。如果你想要在MEMORY表上使用HASH索......
  • 编写类A02,定义方法find,实现查找某字符串是否子啊字符数组中,并返回索引,如果找不到,返回-
    1publicclassHomework02{23//编写一个main方法4publicstaticvoidmain(String[]args){56String[]strs={"jack","tom","mary","milan"};7A02a02=newA02();8intin......
  • SQL中的索引知识点复习文档
    SQL中的索引知识点复习文档此文档是数据分析课程入门篇关于索引知识点的复习文档,本次课程目标是回顾索引的分类、特点及常用操作,此课程代码练习较少,主要为理论知识的快速复习复习时间:2024年8月18日文档总结:2024年8月18日学习时长:视频课程1小时+文档总结1小时课程环境......
  • postgresql 定时收集表和索引统计信息 转发:https://blog.csdn.net/weixin_33711641/a
    --由于pg中表和索引的信息收集都是基于时间点的,对于以往的信息无法与现在的信息进行对比,故写下此工具进行统计信息收集--创建数据信息的schemacreateschemadb_stat;--创建收集信息的基础表createtabledb_stat.snapshot_pg_stat_all_indexes(relidint,indexrelidint,scheman......
  • Oracle索引使用原则:优化查询性能的关键
    1.索引信息的查询:要获取数据库中索引的相关信息,如索引类型、所在表、是否唯一索引等,可以查询与索引相关的数据字典视图。常用的数据字典视图包括dba_indexes、dba_ind_columns、user_indexes和user_ind_columns等。dba_indexes和dba_ind_columns视图需要DBA权限才能访问,......
  • 索引
    相当于目录,用于提高查询速度。绝大多数情况下,数据库表都应该创建索引,避免去遍历整张表,也就是通常说的,避免全表扫描。每次新增数据库属性时,评估一下是否需要新建索引index和key介绍索引之前,先说下index和key的区别:索引(index):负责维护表的查找和操作速度。有普通索引,主键索引......
  • Elasticsearch怎么导出索引数据至CSV
    保存Search打开kibana选择需要保存的index定义好时间区间,需要导出的字段等分享CSV下载CSV导出成功在右下角会出现下载链接......
  • 测试环境治理之MYSQL索引优化篇
    1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试环境的治理,不得不引起......
  • Mysql - 主键索引和唯一索引的异同点
    唯一索引:唯一性:唯一索引保证索引列的值是唯一的,不会有重复。比如,一个班级的学号,每个学生都有一个唯一的学号,不能有重复。可以有多个:一个数据库表中可以有多个唯一索引,就像一个班级可以有多个科目,每个科目都可以有一个唯一的成绩单。允许空值:唯一索引列中可以有一些空值(没有填写的......
  • 超越Perplexity的AI搜索引擎框架MindSearch
    超越Perplexity的AI搜索引擎框架MindSearch介绍MindSearch是InternLM团队的一个开源的AI搜索引擎框架,由中科大和上海人工智能实验室联合打造的,具有与Perplexity.aiPro相同的性能。框架特性:......