美文网首页程序员
记一次数据库查询语句的优化

记一次数据库查询语句的优化

作者: bf1b52c4be3d | 来源:发表于2017-08-13 09:37 被阅读34次

周六的时候,运维告诉我一个sql慢查询一直报警,他把sql语句给到我,让我优化下。

select 
  很多字段
from ad_order
where state = 1
and deleteflag=0
and commentflag = -1
and ordertype in (0,3)
and (confirmtime + 30*60*1000)  <= 1502519143335

这条没有携带关联的查询,居然耗时达到4s。

看下这个sql查询,我看到了四处错误

数据库做了无关的事情

比如 confirmtime + 30*60*1000 <= 1502519143335,这个首先可以
confirmtime <= (1502519143335-30*60*1000) ,进而把加减计算放到php或者java里面去,而不是让数据库来算

表达式让索引失效

还是上面的例子,如果confirmtime字段是一个索引字段,那么上面的表达式会导致索引没有办法发挥效果,从而拖慢查询进度

in的使用

where语句中有一个 ordertype in (0,3),这里有必要说一下业务,ordertype是订单类型,最开始我们的设计 会员水吧订单(0),会员网费订单(1),会员钱包订单(2),服务员水吧订单(3),服务员网费订单(4),服务员钱包订单(5)。这个设计不好,可能当时是第一次做订单系统,踩了这个坑。其实想下,会员水吧订单和服务员水吧订单应该是同一个订单类型,只是来源不一样而已,于是我们把订单类型ordertype优化了之剩下三个,同时添加了一个订单属性叫做订单来源,分别来自会员(0),来自服务员(1),来自老板(2)。

所以这里的in也可以优化掉,那就是ordertype=0就好了

优化组合的使用

数据库表ad_order 已经有组合索引 KEY state type (state,ordertype,deleteflag), 在这个查询中,这个组合索引没起作用,
是因为我们的where的顺序存在问题。
于是我们调整为
where state=1
and ordertype=0
and deleteflag=0
and commentflag=-1
and confirmtime <= (1502519143335 - 30*60*1000)

优化完毕

相关文章

  • MySQL查询优化(分析、索引、配置等)

    数据库的优化包括两个方面,一是SQL语句的优化,二是数据库服务器和配置的优化。下面先讲查询语句的优化。 查询语句优...

  • 慢查询

    含义:可以让mysql记录一些查询超过限定时间的语句,通过开启慢查询,优化SQL语句进而优化数据库系统的性能。 参...

  • spring面试题综合

    优化数据库 1️⃣ 数据库查询使用索引2️⃣ 查询数据不使用*,使用具体字段3️⃣ 语句大写4️⃣ 使用exist...

  • SQL优化

    MySQL查询速度优化: 首先现在navicat中执行查询语句,看查询时间是否较长,若在数据库中的查询时间长则...

  • Mysql官方文档阅读笔记(Select 语句优化)

    官方文档目录 优化select语句 原文 查询语句作为最常用类型的语句,其优化价值理所当然是最大的。 优化查询语句...

  • Mysql优化指的是什么?

    说到数据库优化时,我们是在优化什么? 我们优化的是慢的查询语句 那么什么语句才算得上是慢呢? 8秒原则 什么是8秒...

  • 数据库查询优化器

      所谓查询优化,目标是关系数据库下或者 newSQL 的 SQL Server 层对 SQL 语句进行优化,在不...

  • 数据库的优化方案及如何提高查询效率

    数据库优化方案 优化索引,sql语句,分析慢查询 设计表的时候严格按照数据库设计规范来设计数据库 使用缓存,把京城...

  • 数据库查询优化入门: 代数与物理优化基础

    一. 关系数据库系统的查询处理过程 要做优化, 首先理解查询处理过程.查询处理: 把用户提交给RDBMS的查询语句...

  • Java中常见面试题一(中等)

    Java中常见面试题一(中等) SQL语句优化有哪些?数据库的优化怎样优化? 对查询进行优化,应尽量避免全表扫描,...

网友评论

    本文标题:记一次数据库查询语句的优化

    本文链接:https://www.haomeiwen.com/subject/oumsrxtx.html