活动sql语句索引基本优化

news2024/11/14 14:42:30

前言

        最近接到了一个需求开发,然后开发完成以后打算对sql进行一些优化,于是等所有功能开发完成以后对mapper文件里面的sql,和service层的查询语句都摘出来,然后设计了一些索引,下面就来说说一些大概的优化思路,至于mysql索引这里就不说了,这里只是记录优化的大概思路

优化的过程

        首先先看下数据表的设计,这里只拿了其中两张来进行说明,其中核心字段都去掉了,主要是看查询的核心参数

数据表

CREATE TABLE `zxc_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `activity_id` bigint NOT NULL COMMENT '归属活动id',
	 `name` varchar(2000)  DEFAULT NULL COMMENT '商品英文名称',
	 `name_zh` varchar(2000)  DEFAULT NULL COMMENT '商品中文名称',
  `name_km` varchar(2000) DEFAULT NULL COMMENT '商品柬文名称',
	`store_no` varchar(2000) DEFAULT NULL COMMENT 'no',
  `zxc_store_id` bigint NOT NULL COMMENT '归属参与活动门店id',
  `product_id` bigint NOT NULL COMMENT '商品id',
	 `last_new` tinyint DEFAULT '1' COMMENT '最新的,用来去重的,0-不是,1-是,同一个productId只会有一个是',
  `join_state` tinyint DEFAULT '10' COMMENT '加入状态,10-已加入,11-已退出',
	`del_state` tinyint NOT NULL DEFAULT '10',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB COMMENT='zxc_product表';





CREATE TABLE `zxc_store` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `activity_id` bigint NOT NULL COMMENT '归属活动id',
  `store_id` bigint NOT NULL COMMENT '参与门店主键',
  `store_no` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '参与门店no',
  `store_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `store_name_zh` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `store_name_km` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `del_state` tinyint NOT NULL DEFAULT '10' COMMENT '删除标识符10:正常 11:禁用',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='zxc_store参与表';

存在的sql语句

 select zxc_store_id as activityStoreId, count(1) as productCount from zxc_product where zxc_store_id in(2)  and join_state = 10 and del_state = 10 group by zxc_store_id;

explain结果

  select * from zxc_product where del_state = 10  and (name like concat('%', 'zxc', '%') or name_zh like concat('%', 'zxc', '%') or name_km like concat('%', 'zxc', '%'))
and zxc_store_id = 1 and activity_id = 1 and join_state = 10;

explain结果

select * from zxc_product where del_state = 10 and id like concat('%', 10, '%') and store_no = '11' and zxc_store_id = 1 and activity_id = 2 and join_state = 10; 

explain结果

 select
        sp.id,
        sp.product_id,
        sp.store_no,
        sp.name,
        sp.name_zh,
        sp.name_km,
        s.store_name,
        s.store_name_zh,
        s.store_name_km
        from zxc_product sp left join zxc_store s on sp.zxc_store_id = s.id
        where sp.last_new = 1
        and (s.store_no like concat('%', 'zxc', '%')
            or s.store_name like concat('%', 'zxc', '%')
            or s.store_name_zh like concat('%', 'zxc', '%')
            or s.store_name_km like concat('%', 'zxc', '%'))
           and sp.activity_id = 1;

explain结果

select
        sp.id,
        sp.product_id,
        sp.name,
        sp.name_zh,
        sp.name_km
        from zxc_product sp
        where sp.last_new = 1
      and sp.zxc_store_id = 1; 

explain结果

以上是目前的所有sql,很明显全都是all查询,那么当数据量一大的时候,性能肯定会比较差,因此我们就需要添加索引来提升查询的性能

优化思路 

        sql索引优化一般是尽量不要用单值索引,因为索引也是要占空间的,如果索引过多插入和删除性能也会下降,所以我们一般都是使用复合索引,尽可能的包含所有的查询条件,一张表最多的复合索引也不能过多

        上面的几个sql查询中,其实存在很明显的一个字段会被用到,那就是zxc_store_id字段,所以我们是肯定需要创建一个以zxc_store_id为主的复合索引

        那么问题就来了,它后面还需要加什么比较合适,我们接着往下看,综合看5条sql,很多都会用到 join_state 和 del_state 虽然这两个值都是基数比较低的,但是很多地方都会用到,本来字段类型就是整形的,所以还是可以加入到里面去的

        第2条sql里面还有activity_id,这个字段基数就比较大了,所以我们还应该加一个这个字段,而这个字段需要放在join_state和del_state 前面,因为前面两个基数太低,过滤是很有限制的,store_no字段也是类似的

        最后就是last_new字段了,但是这个使用比较小,而且它的基数也比较低,所以这里我就不进行添加了,所以最后出来的一个索引,就是以五个字段组成的,如下

zxc_store_id,activity_id,store_no, del_state,join_state 按先后顺序创建索引

索引创建sql语句

ALTER  TABLE  `zxc_product`  ADD  INDEX idx_query (zxc_store_id,activity_id, store_no, del_state, join_state)

但是mysql报索引过长了,所以就只能改完4个字段了,如下

ALTER  TABLE  `zxc_product`  ADD  INDEX idx_query (zxc_store_id,activity_id, del_state, join_state)

加入这个索引以后,5个sql,有4个sql的type类型变为了ref,性能其实已经很高了,除了第4条还是all,如下

explain select
        sp.id,
        sp.product_id,
        sp.store_no,
        sp.name,
        sp.name_zh,
        sp.name_km,
        s.store_name,
        s.store_name_zh,
        s.store_name_km
        from zxc_product sp left join zxc_store s on sp.zxc_store_id = s.id
        where sp.last_new = 1
        and (s.store_no like concat('%', 'zxc', '%')
            or s.store_name like concat('%', 'zxc', '%')
            or s.store_name_zh like concat('%', 'zxc', '%')
            or s.store_name_km like concat('%', 'zxc', '%'))
           and sp.activity_id = 1;

explain结果

但是这也是没办法的,因为你确实是在找全部数据了,除非你再进一步过滤数据,不过总体来说,我们只需要进入一个复合索引,查询性能就会比完成没有加索引要快很多了

至于上面的store_no如果也要加入索引,可以再重新设计一个复合索引

总结

        其实这个例子并不复杂,而且相对来说还很简单,只是说我们平时对于索引的创建最好是在功能开发完成以后再进行维护,不然你可能也不知道要在哪些字段加索引,同时我们也要尽量使用复合索引

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

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

相关文章

WPF上位机通信组件与Modbus协议

1、Modbus通信方式与分类 - 串口 RS485(一主多从):不同的报文格式:ModbusAscii(ASCII字符方式进行发送)、ModbusRTU(Remote Terminal Unit) - 以太网(TCP点对点&#…

[博士后申请]套磁信的五大误区

博士后申请有一些技巧需要注意,下面就随知识人网一起来看看博士后申请套磁信的五大误区。 误区一:字数越多越好 Email字数控制在200字左右。教授每天处理上百封邮件,简单明了的邮件内容是为别人节约时间的一种礼貌;简短易回复的信件也会加大…

supervisor常见报错问题处理及使用教程

Supervisor 是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 官网介绍 Supervisor已经过测试,可以在Linux(Ubuntu 9.10)&#xf…

MySql常见复合查询(重点)

复合查询(重点) 多表查询 实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表 EMP,DEPT,SALGRADE来演示如何进行多表查询。 显示雇员名、雇员工资以及所在部门的名字因为上面的数据来…

如何解决Web前端安全问题?

我国网络技术水平的提升,带动着WEB前端业务量的显著增长,人们对于网络服务的需求也日益复杂,与此同时,越来越多的黑客出现,其攻击水平也有了明显提升,WEB前端也成为了众多黑客进行网络攻击的主要目标。 因…

什么是零代码?零代码与低代码有什么联系与区别?

传统的软件研发方式目前并不能很好地满足企业的需求:人员成本高、研发时间长、运维复杂。 这时零代码或低代码工具出现在市面上并被关注就是必然趋势了。对于不太了解两者的人来说,零代码和低代码是什么?又有什么联系与区别? 01 …

uni小程序——评论、文本域、发送、键盘调起、有值后按钮变色等

一、简介 文本域默认显示一行&#xff0c;最多显示4行&#xff0c;到了4行之后不再增高。 输入值后按钮变色 二、案例演示 三、代码 <template><view><view class"plBox"><textarea auto-height"true" maxlength"-1" :s…

[Linux安装软件详解系列]04 安装Redis

目录1、查看服务器是否已安装Redis2、安装Redis1&#xff09;下载2&#xff09;解压3&#xff09;安装4&#xff09;移动配置文件到安装目录下5&#xff09;配置redis为后台启动6&#xff09;将redis-cli&#xff0c;redis-server拷贝到bin下7&#xff09;启动redis8&#xff0…

RabbitMQ简介及在Linux中安装部署(yum)

一、RabbitMQ简介及其作用 RabbitMQ简介 RabbitMQ是在2007 年发布&#xff0c;是一个在 AMQP(高级消息队列协议)基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;是当前最主流的消息中间件之一。RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queu…

Arcpy入门教程01:从零开始制作一个arcpy脚本

从零开始制作一个arcpy脚本 文章目录 需求分析代码实现构造临时工作目录数据处理过程及API解析脚本打包代码封装在红盒子中创建脚本报错提醒 EOL while scanning string literal完整代码需求分析 我们现在有一个GDB存储这西安市各个区的绿地面的GDB,以及碑林区和新城区的行政…

将时间序列转成图像——相对位置矩阵方法 Matlab实现

目录 1 方法 2 Matlab代码实现 3.结果 【若觉文章质量良好且有用&#xff0c;请别忘了点赞收藏加关注&#xff0c;这将是我继续分享的动力&#xff0c;万分感谢&#xff01;】 其他&#xff1a; 1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时…

Nginx实现负载均衡

目录 一、环境准备 1、准备3台centos服务器 2、软件安装 二、负载均衡配置 三、其他分配策略 1、fair&#xff08;第三方&#xff09; 一、环境准备 1、准备3台centos服务器​​​​​​​ 服务器名称主机名IP安装服务备注Nginx反向代理服务器proxy192.168.1.10nginx关…

ES倒排序索引

前言 在学习Elasticsearch的使用前&#xff0c;我们先来了解下es是如何实现全文搜索的。 倒排索引是 Elasticsearch 中非常 重要的索引结构&#xff0c;从 文档单词到文档 ID 的过程 为什么要使用倒排索引 先看下面的商品数据goods id 标题 描述 1 小米手机 小米手机性…

【保姆级】新机器部署Redis

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、安装gcc yum install gcc-c 3、在/usr/tmp目录上传redis安装包 4、将安装包移到/opt/byd目录 mv redis-4.0.11.tar.gz /opt/byd 5、解压 & 重命名 tar -xzvf redis-4.0.11.tar.gz mv redis-4.0.11 …

安全狗受邀出席CIS 2022网络安全创新大会

11月16日&#xff0c;由网络安全行业门户Freebuf主办的CIS 2022网络安全创新大会&#xff08;简称CIS&#xff09;在上海主会场顺利开幕。 作为国内云原生安全领导厂商&#xff0c;安全狗也收到邀请出席此次活动。 据悉&#xff0c;此次大会分为上海、北京、深圳等多个会场&am…

Pytorch中的DDP

一. 概览 DDP的原理&#xff1f; 在分类上&#xff0c;DDP属于Data Parallel。简单来讲&#xff0c;就是通过提高batch size来增加并行度。为什么快&#xff1f; DDP通过Ring-Reduce的数据交换方法提高了通讯效率&#xff0c;并通过启动多个进程的方式减轻Python GIL的限制&am…

2022-11-17 mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析

摘要: mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析 关联ISSUE: https://github.com/stoneatom/stonedb/issues/21 需求分析ISSUE: https://github.com/stoneatom/stonedb/issues/949 上下文说明: 当前聚合运算的结果都缓存在了内存的HASH中, 一旦数据量…

数据库等值查询与统计信息

概念 统计信息是为优化器的 cost 估算提供数据支撑&#xff0c;其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。考虑以下 Case CREATE TABLE mc_tac_template (ID BIGINT ,NAME varchar(50) NOT NULL,GENDER varchar(10) NOT NULL,PRIMARY KEY (ID),KEY K…

工业设计公司的办公环境有哪些特点?

设计公司的办公环境一直被称之为个性化的意味着&#xff0c;见惯了新科技公司的各类智能化豪情万丈的办公环境&#xff0c;也有别于正儿八经办公楼的循规蹈矩&#xff0c;每个设计公司的公司办公室总似一股清流一般的存在&#xff0c;自然各种设计公司&#xff0c;如平面、工业…

Flutter 在项目中使用动画(不使用包)

Flutter 在项目中使用动画(不使用包) 前言 动画对于 web 和移动应用程序都非常重要。但是在移动应用程序中不应该使用夸张的动画。简单但是很多动画使你的应用程序更好用。以至于当你点击一个按钮时&#xff0c;一种平滑的感觉或者页面过渡都会影响到你。 正文 1 按下按钮柔软的…