高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化

总结一下常见查询语句的优化方式

1        COUNT

1.       COUNT的作用

·        COUNT(table.filed)统计的该字段非空值的记录行数

·        COUNT(*)或者是COUNT(not nullable field) 统计的是全表的行数

如果要是统计全表记录数,COUNT(*)效率会比COUNT(not nullable field)要高一点

2.       MYISAM的COUNT

一般执行COUNT操作时需要扫描大量的记录,但是在MyISAM引擎的数据库中,数据库把表的记录数保存起来,所以COUN(*)会非常的快(前提是不包含where条件)

3.       当需要频繁的使用COUNT时,可以考虑使用汇总表的策略

4.       优化小例子

在MYISAM中进行范围查询时,可以减少检索行数的小技巧

原始的:select count(*) from dictionary where id>5.

优化后:select (select count(*) fromdictionary)-count(*) from dictionary where id<=5

减少查询次数

优化前:需要两条语句

Select count(*)from student where area=’SH’

Select count(*)from student where area=’BJ’

优化后:合并成一条

select count(area='SH') as shcount, count(area='BJ') as bjcount from student;

2        优化关联查询

1.       确保ON或USING的字句上有索引

2.       一般情况下只需要在第二个表上创建索引

3.       尽量使 Group by/Order by的表达式中只包含一个表的字段

3        优化子查询

尽量用关联代替子查询

4        优化Group by 以及Distinct

1.       当对关联查询执行group by操作时,使用查询表的标识列作为分组条件效率会比较高

2.       当需要查询的非group by指定的字段时,正常情况下是无法执行的,可以通过inner join 的形式来弥补

select firstname, lastname

from actor

inner join(select actor_id, count(*) as cnt from actor group by(actor_id))

using (actor_id)

3.       group by默认会对查询的结果进行排序,数据量很大的时候可能会比较耗资源,如果你不关心查询结果的顺序,可以通过order by null 避免这种不必要的浪费

5        LIMIT分页

在进行分页查询的时候往往是采用select * from table1 limit 100,20 的方式来提取数据,在处理的过程中会读取120条数据,然后扔掉100条的offset记录,最后返回20条记录给客户端。如果offset的值非常大,效率上可能会有影响,可以尝试

1.       可以通过覆盖索引+inner join的方式来重写sql

select field1,field2,field3

from table1

inner join

(select id from table1 limit 100, 20) as temp

using(id)

2.       如果可以计算出明确的开始点和结束点,可以转换成 between and 的方式,这种方式只会扫描指定的行数,效率比较高

Select * from table1 between 100 and 120.

3.       可以通过位置标签的方式,来减少需要检索的记录数

例如 从某个位置开始。 Select * from table1 whereid>100 limit 20

下图列出了三种方式的效率对比

ef453530618a5b876c48e7b3cc061406.png

在进行分页处理的时候往往需要知道记录的总数,然后用这些总数生成页码。获取总数往往是使用count或是伴随一次全表查询得到的,这个过程也是检索所有的记录,然后再丢掉。为了避免这种浪费可以采取两种策略

·        把页码换成“下一页”的方式,这样就只需要去取固定的条数

·        一次性读取1000条,当一千条使用完后,采用“获取更多记录”的方式再获取1000条

6        UNION

·        Union操作会对处理后的结果执行distinct操作,这在很多时候是没有必要的。可以采用union all来避免这个问题

7        自定义变量

合理灵活的使用自定义变量往往会给程序的性能带来意想不到的效果,但往往也会带来与其他数据库系统的兼容性问题。

下面列出几个自定义变量使用的小例子

·        行号

mysql> set @rownumber:=0;

mysql> select mean, @rownumber:=@rownumber+1 from dictionary limit10;

·        避免重复查询刚刚更新的数据

在更新完一条记录后,往往需要再次执行select查询刚刚更新过的记录

通过变量可以避免这种问题

Mysql>set @updaterow:=null;

mysql> update dictionary set mean='update get variable' where id=100and @updaterow:=now();

·        统计更新和插入的数量

mysql> set @x:=0;    //define avariable

mysql> insert into dictionary (id,mean) values(3,'duplicate') onduplicate key update mean=values(mean)+(0*(@x:=@x+1)); //insert a duplicaterecord

mysql> select @x; //get x value, it’s indicator duplicate times

8        静态分析工具

有时候可以借助专门的查询分析工具来发现自己的问题,比如pt-query-advisor(http://www.percona.com/doc/percona-toolkit/2.1/pt-query-advisor.html)

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

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

相关文章

ORA-01861: 文字与格式字符串不匹配

select to_date(20160401000000,yyyy-mm-dd) from dual; ---------- 报错&#xff1a;ORA-01861: 文字与格式字符串不匹配 原因&#xff1a;字符串20160401000000与要转换的格式 yyyy-mm-dd 格式不对。 20160401000000 是 yyyymmddhh24miss 格式的 -------- select to_da…

首席架构师徐海峰眼中的架构和出色的架构师

CSDN架构领域编辑采访了一些与会讲师&#xff0c;谈谈他们将在会上分享的内容、相关技术和程序人生&#xff0c;带你领略讲师风采。 本期我们采访的讲师是来自阅文集团首席架构师徐海峰&#xff0c;主要负责内容中心的网站架构和分布式存储、分布式计算工作。10年互联网开发经验…

java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法

很多时候在javaweb项目中我们需要用到Socket通信来实现功能&#xff0c;在web中使用Socket我们需要建立一个监听程序&#xff0c;在程序启动时&#xff0c;启动socket监听。我们的应用场景是在java项目中&#xff0c;需要外接如一个硬件设备&#xff0c;通过tcp通信&#xff0c…

hadoop-eclipse-plugin使用

下载hadoop安装包&#xff1a;http://www.carfab.com/apachesoftware/hadoop/common/hadoop-1.0.2/ 但是没有plugin&#xff0c;我到这个地方下载的&#xff1a;http://ishare.iask.sina.com.cn/f/23642243.html?fromlikecopy到你的eclipse_home的plugins下面。配置map/reduce…

hadoop eclipse plugin windows下载集合

收集了hadoop稳定版本的eclipse plugin for windows。资源分一律为0分 hadoop-eclipse-plugin-1.2.1.jar http://download.csdn.net/detail/zengmingen/9488180 hadoop-eclipse-plugin-2.2.0.jar http://download.csdn.net/detail/zengmingen/9488182 hadoop-eclipse-pl…

java 记事本界面_JAVA/GUI程序之记事本

自上半年JAVA课程结束后&#xff0c;再也没有看过JAVA了&#xff0c;最近不是很忙&#xff0c;又简单的看了看&#xff0c;本博客纯属记录学习过程&#xff0c;请大神们别笑&#xff0c;其中错误是难免的&#xff0c;毕竟是新手写的博客。下面就进入我们的正题吧&#xff0c;复…

104. Maximum Depth of Binary Tree

104. Maximum Depth of Binary Tree 题目 Given a binary tree, find its maximum depth.The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 解析 // Maximum Depth of Binary Tree class Solution { publ…

mapper-reducer word count 实例

统计一个文件里各单词的个数&#xff0c;假设这个文件很大。 原理如下图&#xff1a; 编写代码&#xff1a; WCMapper.java package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; …

java 远程调用url_使用Java的URL/HttpURLConnection进行远程调用(POST请求)

利用Java的HttpURLConnection进行远程url请求(调用远程接口)测试类&#xff1a;请求类型为json,以post方式请求&#xff0c;利用OutputStream写入数据实体类&#xff1a;public class User implementsSerializable {privateString name;privateString password;publicString ge…

LindDotNetCore~职责链模式的应用

回到目录 职责链模式 它是一种设计模块&#xff0c;主要将操作流程与具体操作解耦&#xff0c;让每个操作都可以设置自己的操作流程&#xff0c;这对于工作流应用是一个不错的选择&#xff01; 下面是官方标准的定义&#xff1a;责任链模式是一种设计模式。在责任链模式里&…

MR程序的几种提交运行模式

MR程序的几种提交运行模式 本地模型运行 1/在windows的eclipse里面直接运行main方法&#xff0c;就会将job提交给本地执行器localjobrunner执行 ----配置path&#xff1a;D:\hadoop-2.7.2\bin ----配置hadoop_home&#xff1a;D:\hadoop-2.7.2 ----复制 hadoop.dll和winutil…

构件之法读书笔记04

我们前两周我们团队一起制作了一个大学生记账软件&#xff0c;但是我们没有对我们的软件进行测试&#xff0c;只要是这个功能能够顺利进行&#xff0c;我们就觉得OK。 其实&#xff0c;我认为我们的软件是有问题的&#xff0c;对于一些极限的操作能否完成&#xff0c;在各种环境…

零点起飞学java视频_零点起飞学java (刘升华) 高清PDF_IT教程网

资源名称&#xff1a;零点起飞学java (刘升华) 高清PDF第1篇 java开发基础第1章 java概述( 教学视频&#xff1a;37分钟) 2第2章 基本数据类型及运算( 教学视频&#xff1a;52分钟) 14第3章 java程序流程控制( 教学视频&#xff1a;33分钟) 36第4章 类与对…

【Spark】开发Spark选择Java还是Scala?

Spark-Java-Scala-哪种语言 spark java 支持_百度搜索(1 封私信)Spark 中用 Scala 和 java 开发有什么区别&#xff1f; - 知乎(1 封私信)Spark平台下&#xff0c;scala比java更有优势么&#xff1f; - 知乎

vector 修改 java_java对vector动态数组中的对象排序,以下代码有何问题,如何修改?...

展开全部package com.tx.collection;import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.Vector;public class Student {String name;int score;public S…

hadoop的序列化与java的序列化区别

java的序列化机制 java序列化时会把具体类的数据和类的继承结构信息都序列化传递。如下图hadoop的序列化机制 序列化类的数据&#xff0c;但是不序列化类的继承结构信息。 网络传递的时候就少了很多流量&#xff0c;hadoop也不需要类的继承关系&#xff0c;只要类的数据就够…

java mail 已发送_JavaMail获取已发送邮件

public static voidmain(String args[]) {Properties props new Properties(); //参数配置props.setProperty("mail.transport.protocol", "smtp"); //使用的协议(JavaMail规范要求)props.setProperty("mail.smtp.host", "smtp.exmail.qq.c…

ORA-08103: object no longer exists

今天工具箱报错&#xff1a; ORA-08103: object no longer exists 查了原因&#xff0c;是有session在操作表&#xff0c;比如插入&#xff0c;更新等。而工具箱这个操作刚好在select表&#xff0c;所以报错。-------下文是英文解释----- ORA-08103: object no longer exists错…

【Spark】Spark-空RDD判断与处理

Spark-空RDD判断与处理 SparkKafkaDemo - Streaming Statisticsrdd isempty count_百度搜索Spark RDD.isEmpty costs much time - Stack OverflowSpark Streaming中空RDD的处理-Spark-about云开发[SPARK-5270] Provide isEmpty() function in RDD API - ASF JIRA19 Spark Stre…

JDBC开发步骤

JDBC开发步骤&#xff1a; 1、加载数据库驱动 2、通过DriverManager获取数据库连接Connection 3、通过Connection获取Statement/PreparedStatement 4、将SQL语句绑定到Statement/PreparedStatement中去&#xff0c;准备向数据库发送SQL语句 5、执行完sql语句后&#xff0c…