工作中MySql的小技巧

1. 跑脚本时,经常遇到有则更新无插入的 逻辑操作;通常情况下,来一波if()判断然后选择 更新还是插入,前两天逛论坛时发现有人在比较REPLACE INTO 和 INSET INTO *** ON DUPLICATE KEY UPDATE ** 的 效率,觉得这是一个是优化以前做法的知识,有点意思。
  • REPLACE INTO 与 INSET INTO *** ON DUPLICATE KEY UPDATE ** 的使用与比较

先创建一个实验表

CREATE TABLE gmm_test (
id INT AUTO_INCREMENT PRIMARY KEY,
`unqi` INT,
field1 INT,
field2 VARCHAR(12),
UNIQUE KEY (unqi)
) ;

这张表里面,id自增,unqi是唯一索引。

同时我们添加一条记录:

INSERT INTO `gmm_test` (`unqi`,`field1`,`field2`) VALUES (2,2,'ddd');

表里面是这样的:

id    unqi  field1  field2  

 1       2       2  ddd

当我们想以unqi为条件来一波--有更无增(指符合条件的记录执行更新,不符合的则插入新纪录,下同) 操作时;

如下即可:

REPLACE INTO `gmm_test` (`unqi`,`field2`) VALUES (2, 'qqqq')

执行后,有如下结果:

1 queries executed, 1 success, 0 errors, 0 warnings

查询:replace into `gmm_test` (`unqi`,`field2`) values (2, 'qqq')

共 2 行受到影响

执行耗时   : 0.003 sec
传送时间 : 0.003 sec
总耗时 : 0.006 sec

这时你应该注意到,共2行受到影响

看下表的结果,

id    unqi  field1  field2  

 2       2  (NULL)  qqqq

连主键id都自增了一次,所以在使用时要注意了,毕竟id变了可不是小事~~

**再来看看 INSET INTO *** ON DUPLICATE KEY UPDATE , 这个也可以来 ---有更无增;

INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10;

或者

INSERT INTO gmm_test (unqi, field1, field2) VALUES (2, 10, 'qqqq') ON DUPLICATE KEY UPDATE field1 = values(field1);

结果如下:

查询:INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10

共 2 行受到影响

执行耗时   : 0.002 sec
传送时间 : 0.001 sec
总耗时 : 0.003 sec

虽然也是两行,但是主键id并没有变,

id    unqi  field1  field2
2 2 10 qqqq

关于效率问题,木有测,就借网上别人测好了的吧 .这里

总结下来,就是尽量还是不用replace into 吧,毕竟好多坑

2. 我在统计我爬虫抓取到的一些内容的时候,又一次需要一个 堆叠的条形图,相当于将一个字段的值按区间来分组。

比如我要统计 在线时间 分别 在 050h,50100h,100200h,200500h ,200h以上 内的人数分别有多少?

SELECT ELT(INTERVAL(h.online_time,0, 50,100, 200), '0','50','100', '200') AS on_time, COUNT(h.online_time) AS cnt
FROM hupu_user h
GROUP BY ELT(INTERVAL(h.online_time, 0, 50,100, 200), '0','50','100', '200');

解释:

INTERVAL(N,N1,N2,N3,..........)

INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值。该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N为NULL,它将返回-1。列表值必须是N1<N2<N3的形式才能正常工作。

eg:

假设有一个下载速度表(有 speed 和 count 两个字段),

然后统计1M,2M,4M,8M,8M以上这个5个速度区间的个数

select INTERVAL(speed,1000,2000,4000,8000) as i_s, sum(count)  from a_speed_table  group by i_s

上面的 sql 根据速度区间分组,再对不同区间出现的次数求和

ELT(N,str1,str2,str3,...)

如果N =1返回str1,如果N= 2返回str2,等等。返回NULL如果参数的数量小于1或大于N。ELT()是FIELD()的补集。 这个比较好理解了

3. order by 排序重复的问题。

当order by 后面值相同时,系统对数据的排序可能变得随机化,即一会儿这条数据在前面,一会儿这条数据在后面了 ,所以我们看到了重复数据,所以在分页的时候使用oerder by的时候最后在目标排序字段的基础上再加上一个字段,组成一个不会相同的排序依据

···这些也不算难,权当些无聊时的获取些笔记乐趣吧,然后想吐槽下博客园对markdown格式支持还是有些不一样额,和预期的排版差一些~~||0,0||···

##########作者:fredGui

##########来源:http://www.cnblogs.com/guixiaoming/p/8672343.html

##########
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*

工作中MySql的了解到的小技巧的更多相关文章

  1. MySQL平滑删除数据的小技巧【转】

    今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的SQL语句: delete from test_track_log where log_time < '2019-1-7 00: ...

  2. [转]11个教程中不常被提及的JavaScript小技巧

    原文地址: https://www.cnblogs.com/ld1024/p/10723827.html 这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日 ...

  3. 11个教程中不常被提及的JavaScript小技巧

    这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是我们又很容易忽略. 1.过滤唯一值 Set类型是在ES6中新增的,它类似于数组,但是 ...

  4. 「Python-Django」Django中使用数据库的 9 个小技巧

    Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...

  5. mysql 使用的三个小技巧

    mysql 使用的三个小技巧 快速阅读 Mysql查询工具中如何查询多条语名,Mysql中如何设置变量,Mysql中如何查特定字段,后面再加* Mysql查询工具中如何查询多条语名 默认myslq只能 ...

  6. 【mysql】工作中mysql常用命令及语句

    1.查看mysql版本号 MySQL [release_test_oa]> select version(); +------------+ | version() | +----------- ...

  7. MySQL大表DROP删除小技巧(转)

    在日常工作中,经常会遇到历史大表从主库上迁移到备份机,以便腾出主库空间,那么如果你直接drop table 后,可能会引起数据库抖动,连接数升高等问题,从而影响业务. 那么用一个小技巧,即可轻松平滑的 ...

  8. Win10 UWP开发中的重复性静态UI绘制小技巧 2

    小技巧1 地址:http://www.cnblogs.com/ms-uap/p/4641419.html 介绍 我们在上一篇博文中展示了通过Shape.Stroke族属性实现静态重复性UI绘制,使得U ...

  9. Win10 UWP开发中的重复性静态UI绘制小技巧 1

    介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态的界面设计.比如:画许多等距的线条,画一圈时钟型的刻度线,同特别的策略排布元素,等等. 读者可能觉得这些需求十分简单, ...

随机推荐

  1. HI3531由DMA 发起PCIe 事务

    Hi3531 PCIe 控制器内含DMA 控制器,DMA 控制器包含有两个DMA 通道(一个 DMA 读通道和一个DMA 写通道).PCIe 控制器内包含的DMA 控制器用于大数据量 的存储器读写事务 ...

  2. (六)java结构控制语句

    选择语句,也叫条件分支语句:if--else和switch--case:其中if--else中的else是可选的,但是switch--case中的case是必须的.     switch后的条件必须是 ...

  3. Linux显示目前与过去登入系统的用户相关信息

    Linux显示目前与过去登入系统的用户相关信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ last youhaido pts/0 :0 Sat Jan 2 ...

  4. W: 无法下载 bzip2:/var/lib/apt/lists/partial/extras.ubuntu.com_ubuntu_dists_trusty_main_source_Sources

    1 错误描述 youhaidong@youhaidong:~$ cd 下载 youhaidong@youhaidong:~/下载$ sudo apt-get update 忽略 http://cn.a ...

  5. Python实现一些常用排序算法

    一些常用的排序 #系统内置排序算法#list.sort()#heapq模块 def sys_heap_sort(list): import heapq heap = [] for i in range ...

  6. Directory Opus(DO) 个人使用经验 2.0

    设置已有命令的快捷键 设置方法 保存显示格式 保存方法 取消删除确认框 Windows取消删除确认框DO取消删除确认框 设置默认布局 设置方法 备份与恢复 设置已有命令的快捷键 已有命令指的是菜单栏上 ...

  7. java中垃圾回收机制和引用类型

    在java中JDK1.2版本以后,对象的引用类型分为四种,从高到低依次为:强引用.软引用.弱引用.虚引用. ①强引用的特点:垃圾回收机制绝不会回收它,即使内存不足时,JVM宁愿抛出OutOfMemor ...

  8. link-cut-tree 简单介绍

    link-cut-tree 简单介绍 前言:这个算法似乎机房全都会,就我不会了TAT...强行搞了很久,勉强照着别人代码抄了一遍qwq 这个本人看论文实在看不懂,太菜了啊!!! 只好直接看如何实现.. ...

  9. 【BZOJ4569】萌萌哒(并查集,倍增)

    [BZOJ4569]萌萌哒(并查集,倍增) 题面 BZOJ 题意: 有一个长度为\(n\)的数 给定\(m\)个限制条件 每次限制\(l1-r1\)与\(l2-r2\)是相同的 求出方案数 题解 如果 ...

  10. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...