高性能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.pswp.cn/news/539663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539663.shtml
英文地址,請注明出處:http://en.pswp.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…