mysql慢查询优化

文章讨论了MySQL查询语句导致的慢查询问题,指出索引选择、排序方式和过滤性对查询性能的影响。通过分析,提出了两种解决方案:一是强制使用特定索引去除`is_deleted`字段,二是创建`mall_flow_id`的单个索引以优化排序操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下表:

CREATE TABLE "goods_relation_inherit_goods_flow" (
  "id" bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  "mall_flow_id" bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'mall_flow_id',
  "goods_id" bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
  "goods_name" varchar(255) NOT NULL DEFAULT '' COMMENT '商品名',
  "out_goods_id" bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '外部商品id',
  "out_goods_name" varchar(255) NOT NULL DEFAULT '' COMMENT '外部商品名',
  "out_sold_count_month" bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '销量',
  "out_sold_count_total" bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '销量',
  "crawl_time" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '销量的时间',
  "status" tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态',
  "out_detail_url" varchar(4096) NOT NULL DEFAULT '' COMMENT '外部商品详情链接',
  "out_pic_url" varchar(2048) NOT NULL DEFAULT '' COMMENT '外部商品图片链接',
  "is_deleted" tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '1已删除,0未删除',
  "gmt_created" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间戳',
  "gmt_modified" timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间戳',
  "out_goods_sn" varchar(255) NOT NULL DEFAULT '' COMMENT '商品货号',
  "transferred_out_pic_url" varchar(2048) DEFAULT '' COMMENT '转换过的外部图片链接',
  "out_goods_detail" text COMMENT '外部商品详情',
  "out_source_type" tinyint(3) DEFAULT '0' COMMENT '外部商品来源',
  "goods_commit_id" bigint(20) DEFAULT '0' COMMENT '商品提交的id',
  "check_status" tinyint(3) DEFAULT '0' COMMENT '检测是否可以转为商品',
  "transfer_status" tinyint(3) DEFAULT '0' COMMENT '修改来源服务',
  "source_service" varchar(32) DEFAULT '' COMMENT '修改来源服务',
  "out_comment_count" bigint(20) NOT NULL DEFAULT '-1' COMMENT '外部商品评论数',
  PRIMARY KEY ("id"),
  KEY "idx_mallflowid_goodsid" ("mall_flow_id","goods_id"),
  KEY "idx_outgoodsid" ("out_goods_id"),
  KEY "idx_mallflowid_outgoodsid" ("mall_flow_id","out_goods_id"),
  KEY "idx_goods_commit_id" ("goods_commit_id"),
  KEY "idx_gmt_created" ("gmt_created"),
  KEY "idx_mallflowid_checkstatus_transferstatus" ("mall_flow_id","check_status","transfer_status"),
  KEY "idx_transfer_status" ("transfer_status"),
  KEY "idx_gmt_modified" ("gmt_modified")
) ENGINE=InnoDB AUTO_INCREMENT=27508135 DEFAULT CHARSET=utf8mb4 COMMENT='流水表'

查询语句

select id, mall_flow_id, goods_id, goods_name, out_goods_id, out_goods_name, out_sold_count_month, 
    out_sold_count_total, status, out_detail_url, out_pic_url, is_deleted, gmt_created, 
    gmt_modified, crawl_time, out_goods_sn, transferred_out_pic_url, out_thumb_url, out_low_price, 
    out_high_price, out_source_type, goods_commit_id, check_status, transfer_status, 
    source_service, out_comment_count
   from goods_relation_inherit_goods_flow
   WHERE  mall_flow_id = 52469 and is_deleted = 0 order by id desc limit 0,1    慢查询
   
select * from  `goods_relation_inherit_goods_flow` where mall_flow_id=52469  and is_deleted=0 order by id desc  慢
   
select id, mall_flow_id, goods_id, goods_name, out_goods_id, out_goods_name, out_sold_count_month, 
    out_sold_count_total, status, out_detail_url, out_pic_url, is_deleted, gmt_created, 
    gmt_modified, crawl_time, out_goods_sn, transferred_out_pic_url, out_thumb_url, out_low_price, 
    out_high_price, out_source_type, goods_commit_id, check_status, transfer_status, 
    source_service, out_comment_count
   from goods_relation_inherit_goods_flow
   WHERE  mall_flow_id = 52469 and is_deleted = 0 order by id desc   不慢
   
   
select * from  `goods_relation_inherit_goods_flow` where mall_flow_id=52469  and is_deleted=0  limit 0,1 不慢

以上语句慢查询:
在这里插入图片描述
这几个数字,会影响 索引的选择。
你要按主键逆序排序,就得加一条独立的 mall_flow_id 进来。
另外,如果 新加的索引的过滤性 没有我截图的数字高,那还是可能选不中这条 独立索引的。
在这里插入图片描述
在这里插入图片描述
就是索引启用了 ICP 功能。
你前面有一堆 mall_flow_id 的联合索引。
但这些索引里面没有一个有 is_deleted 字段

不加,那些索引 可以直接在 索引上做一些过滤操作。
加了,就得回表去读。
但是 你还是要排序的。
去了 is_deleted 后
这个 很耗时。
需要在内存里面单独创建排序索引。

最终解决:一、强制一个索引 去掉is_deleted (业务上可以 不去300ms 去掉 30ms) 二、建立mall_flow_id的单个索引

对于MySQL慢查询优化,有几个常见的方法和技巧可以尝试: 1. 确定慢查询:首先使用MySQL慢查询日志或性能分析工具(如Percona Toolkit)来确定哪些查询较慢。这样可以帮助你了解具体的问题。 2. 优化查询语句:检查慢查询中的SQL语句并进行优化。你可以考虑添加适当的索引以提高查询性能,或者重写复杂的查询语句以简化其逻辑。 3. 优化数据库结构:检查数据库表的设计和结构,确保表中的字段类型、索引和约束等设置是合理的。合理的数据库设计可以提高查询性能。 4. 避免全表扫描:尽量避免在大表上执行全表扫描操作,可以通过添加索引或者改进查询条件来避免全表扫描。 5. 调整系统配置参数:根据数据库负载和硬件性能,调整MySQL的配置参数,如缓冲区大小、连接池大小等,以提高系统性能。 6. 使用缓存:考虑使用缓存技术(如Redis)来缓存常用的查询结果,减轻数据库的压力。 7. 分离读写操作:将读操作和写操作分离到不同的数据库实例或服务器上,可以提高数据库的并发性能。 8. 使用慢查询日志或监控工具:定期分析慢查询日志,或者使用监控工具(如Prometheus和Grafana)来实时监测数据库性能,并及时调整和优化。 这些是一些常见的MySQL慢查询优化方法,具体的优化策略需要根据具体情况进行调整和实施。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值