《MySQL tips:查询时,尽量不要对字段进行操作》

维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。
建表语句如下:

create table 'tradelog' ('id' int(11) not null,'tradeid' varchar(32) default null,'operator' int(11) default null,'t_modified' datetime default null,primary key ('id'),key 'tradeid' ('tradeid'),key 't_modified' ('t_modified')
) engine = InnoDB default charset = utf8mb4;

假设已经记录了从2016年初到2018年底的所有数据,运营部门有一个需求:统计发生在所有年份中7月份的交易记录总数。
我们可以这样写:

select count(*) from tradelog where month(t_modified) = 7;

t_modified字段上有索引,但是会发现这条语句执行时间特别久,才返回结果。
但是MySQL规定:如果对字段做了函数计算,就不能使用索引。
也就是说:
条件为where t_modified = '2018-7-1'时,可以用上索引,而改成where month(t_modified) = 7的时候就不行了。
B+树同一层的兄弟节点是有序的,所以可以快速定位。
而当使用了month()函数,传入7时,其实B+树不知道接下来是取子节点还是兄弟节点。
所以说对索引字段做函数操作,优化器无法判断最终的结果是不是有序的,所以就会放弃使用搜索树,只能全部扫描该索引树。所以建议在查询时,尽量不要对字段进行操作

为了能够用上索引的快速定位能力,我们就要把SQL语句改成基于字段本身的范围查询:

select count(*) from tradelog where-> (t_modified >= '2016-7-1' and t_modified < '2016-8-1') or-> (t_modified >= '2017-7-1' and t_modified < '2017-8-1') or-> (t_modified >= '2018-7-1' and t_modified < '2018-8-1');

优化器在对于不改变有序性的函数上,也不会考虑使用索引。比如:对于select * from tradelog where id + 1 = 10000这个SQL语句,
这个+1不会改变有序性,但是优化器还是不能用id索引快速定位到9999这一行。所以需要我们在写SQL语句时,手动改写成where id = 10000 - 1才行。

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

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

相关文章

cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍 参考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 简单3d 模型支持 第一步实现对3d 模型的简单支持&#xff0c;完成一个CCSprite3D 类 参考CCSprite 类 以及 CCGLProgram 代码 主要修改 draw 方法。 添加了定点数组…

关于web.config中customErrors节点说明

关于web.config中<customErrors>节点说明 <customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性&#xff0c;其中defaultRedirect属性是一个可选属性&#xff0c;表示应用程序发生错误时重定向到的默认URL&#xff0c;如果…

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基&#xff1a;肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态&#xff0c;函数的参数类型可以不确定吗&#xff1f; 函数的返回值只能是一个吗&#xff1f;函数的返回值可以不确定吗&#xff1f; 泛型是一种特殊的类型&#xff0c;它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…

HDU4291 A Short problem

求通项和斐波那契数列的方法一样&#xff0c;矩阵快速幂。 这道题麻烦在套了三层。 但其实取模这种操作肯定会出现循环的&#xff0c;可以先本地暴出循环节&#xff0c;1000000007对应的循环节是222222224&#xff0c;222222224对应的循环节是183120。 最外层的结果是对1000000…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR&#xff1a;Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…

《MySQL——查询长时间不返回的三种原因与查询慢的原因》

目录查询长时间不返回等MDL锁等flush等行锁查询慢构造一张表&#xff0c;表有两个字段id和c&#xff0c;再里面插入了10万行记录 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

Linux 命令积累 fuser lsof mtr

fuser 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;lsof MTR fuser命令 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;语法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目录…

线程终止问题

http://topic.csdn.net/u/20080429/09/9cfe5204-20b5-40fb-ac12-afdc1e4939e9.html?590511460 线程终止问题 http://blog.csdn.net/wuyazhe/article/details/1771470 带有消息机制的线程 - CustomMessageQueue(c#) using System; using System.Collections.Generic; using Sy…

HTH的完整形式是什么?

HTH&#xff1a;希望这个(那个)有帮助 (HTH: Hope This (That) Helps) HTH is an abbreviation of "Hope This (That) Helps". HTH是“希望有帮助”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking si…

排序算法复习—希尔排序

希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。 希尔排序将整个待排元素序列分割成若干个子序列&#xff08;由相隔某个“增量”的元素组成的&#xff09;分别进行直接插入排序&#xff0c;过程中较小的元素&#xff0c;跳跃式的往前…

《MySQL——幻读与next-key lock与间隙锁带来的死锁》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);该表除了主键id&#xff0c;还有索引c。 问下面的语句…

css 阴影 效果_CSS阴影效果

css 阴影 效果CSS中的阴影效果 (Shadow Effects in CSS) It is always good to make our web pages stylish and beautiful, web pages that would catch users eyes instantly but one gets confused as to how to style his or her web page. The confusion is quite legit t…

java常见的ClassNotFoundException-----菜鸟学习java

java常见的ClassNotFoundException 1 - java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 添加包common-logging.jar2 - java.lang.ClassNotFoundException: javax.transaction.Synchronization 添加包jta.jar(hiberante)3 - java.lang.ClassNo…

关于easyui的一些小知识点(1)

让layout布局自动适应浏览器宽度只需要加上fit"true"属性。转载于:https://www.cnblogs.com/haifg/p/3613789.html

《MySQL——加锁规则(待补全,有些没看懂)》

catalog加锁规则等值查询间隙锁非唯一索引等值锁主键索引范围锁非唯一索引范围锁唯一索引范围锁 bug非唯一索引上存在"等值"的例子limit语句加锁关于死锁总结 1、查询过程中访问到的对象才会加锁&#xff0c;而加锁的基本单位是next-key lock&#xff08;前开后闭&am…

c# 命名空间命名规范_C#中的命名空间

c# 命名空间命名规范C&#xff03;命名空间 (C# Namespace ) In C# namespaces are used to group similar type of classes. Two classes with same name in different namespaces never conflict to each other. 在C&#xff03;中&#xff0c;名称空间用于对相似类型的类进…

PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程

这两天刚装好Windows 7&#xff0c;碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境&#xff0c;所以打算勤劳下&#xff0c;手动一步步搭建PHP环境&#xff0c;暂且不使用PHP环境搭建软件了&#xff0c;在此详细图解在Windows 7下安装配置PHPApacheMysql环境的教程&#…

《MySQL—— 业务高峰期的性能问题的紧急处理的手段 》

catalog短连接风暴先处理占着连接但是不工作地线程减少连接过程的消耗慢查询性能问题索引没有设计好语句没写好选错索引QPS突增问题短连接风暴 正常的短连接&#xff1a; 执行很少sql语句就断开&#xff0c;下次需要的时候再重连。MySQL建立连接的过程成本很高&#xff0c;包含…