1. 程式人生 > >多表外連線效能測試及優化

多表外連線效能測試及優化

   前提:資料庫中一共有三個表:class,book,phone,而且每個資料庫表中都有10萬條資料,三個表一共有30萬條資料,從大資料量的角度來檢測你寫的sql語句效能是如何的.

一.左連線

sql語句查詢前10000條資料,sql語句表示如下:

select  * from class LEFT JOIN book on class.card=book.card limit 10000
查詢時間為:

explain檢測效能,語句為:

EXPLAIN
select  * from class LEFT JOIN book on class.card=book.card limit 10000
其結果:

從此我們可以看出兩個的type都是all ,其中class表需要檢測的行數是100398,book表需要檢測的行數是100453,可以看出這是一個多麼大的工程.

book表中插入索引:

ALTER TABLE `book` ADD INDEX y ( `card`);

其結果為:


查詢時間為: 查詢速度是沒有新增索引時的31.6,那麼再來看看它的效能


從結果中,我們可以看出第二行的type變成了ref ,其中rows也從原來的100453變成了523.優化的比較明顯.leftjoin條件用於確定如何從右表搜尋行,左邊一定都有,所以右邊是我們的關鍵點,一定需要建立索引.

刪除舊索引

,建立class表的新索引

DROP INDEX y ON book;
ALTER TABLE `class` ADD INDEX x ( `card`);

SQL語句執行所需要的時間:

查詢時間和未新增索引的時候索引值差不錯.

那看看效能:

Class表的type變成了index,還是很糟糕的,而且兩個表的rows都是100453,這還是一個很大工程.

二.右連線

其中還是保持class表中的card欄位建立索引,sql語句為:

select  * from class RIGHT  JOIN book on class.card=book.card limit 10000
執行時間為:

其效能為:


    優化較明顯,這是因為Right join是先執行book表,在執行class表格,right join條件用於確定如何從左表搜尋行,右邊一定都有,所以左邊是我們的關鍵點,一定需要建立索引.

刪除就索引,book表中建立新索引:

DROP INDEX y ON book;
ALTER TABLE `book` ADD INDEX y ( `card`);

sql語句查詢時間為:

sql語句效能:

其情況和兩個表都不新增索引的沒有多大的變化.

三.內連線

最後來看看inner join的情況,book表的card欄位建立了索引,class表未建立索引,sql語句:

select  * from class INNER  JOIN book on class.card=book.card limit 10000

sql語句執行時間:

其效能:


再在class表中建立索引試試:

ALTER TABLE `class` ADD INDEX x ( `card`);

其查詢時間為:


查詢時間沒有多大變化,但是sql語句的效能呢?


結果是沒有多大的變化.

從以上的測試我們可以得出:

inner join left join差不多,都需要優化右表。而 right join需要優化左表。

四.三表連線

那三個表又該如何優化呢?三個都無索引的時候,sql查詢語句如下:

select * from class left join book on class.card=book.card 
left join phone on book.card = phone.card

limit  10000

查詢時間:

還在可以接受的範圍內.

其效能:

從結果可以看出,結果並不太理想.再來看看新增索引的情況

分別給phone表和book,class表新增索引,sql語句如下:

ALTER TABLE `class` ADD INDEX x ( `card`);
ALTER TABLE `phone` ADD INDEX z ( `card`);
ALTER TABLE `book` ADD INDEX y ( `card`);

查詢時間為:

 其效能為:

最後兩行的type都是ref ,rows的值是500左右,優化效果還是很不錯的.

    在建立資料的初期,可以根據業務的需要,適當的建立索引還是很有必要的,適當的索引可以大大提高sql語句的效能.


相關推薦

連線效能測試優化

   前提:資料庫中一共有三個表:class,book,phone,而且每個資料庫表中都有10萬條資料,三個表一共有30萬條資料,從大資料量的角度來檢測你寫的sql語句效能是如何的. 一.左連線 用s

Mysql 聯合查詢效率分析優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Python程式設計實現對2個字串最長的公共子串的多種求解方式,效能測試優化

解法1-暴力求解法: def LongestCommonSubstring(FirstString,SecondString): ''' 求最長子串解法1: 以字串1的每個漢字作為起始位置 去字串2中找到能與之匹配的最長長度 將這個長度和記錄的最長長度比較

JNI/NDK開發指南(九)——JNI呼叫效能測試優化

在前面幾章我們學習到了,在Java中宣告一個native方法,然後生成本地介面的函式原型宣告,再用C/C++實現這些函式,並生成對應平臺的動態共享庫放到Java程式的類路徑下,最後在Java程式中呼叫宣告的native方法就間接的呼叫到了C/C++編寫的函數

JNI/NDK開發指南(八)---JNI呼叫效能測試優化

在前面幾章我們學習到了,在Java中宣告一個native方法,然後生成本地介面的函式原型宣告,再用C/C++實現這些函式,並生成對應平臺的動態共享庫放到Java程式的類路徑下,最後在Java程式中呼叫宣告的native方法就間接的呼叫到了C/C++編寫的函數了,在C/C++

Android UI效能專項測試優化

1 UI卡頓(Jank) 內容的快速載入很重要,渲染的流暢性也很重要。android團隊把滯緩,不流暢的動畫定義為jank,一般是由於丟幀引起的。安卓裝置的螢幕重新整理率一般是60幀每秒(1/60fps=16.6ms每幀),所以你想要渲染的內容能在16ms內完

python-day71--django雙下劃線查詢分組聚合

cts 劃線 django del 就是 auth 分組聚合 with 沒有 #====================================雙下劃線的跨表查詢===============# 前提 此時 related_name=bookList 屬性

07 mysql 查詢(連線查詢)

 每個資料庫中可以存放多張表,真正的應用中經常需要從多個數據表中讀取資料 笛卡爾乘積 多表進行連線查詢時沒有任何條件,最終的結果是多表結果數量乘積的現象被稱為笛卡爾積 例如 SELECT e.employeename,d.departmentname FROM depart

迴圈查詢資料的效能問題優化

寫在前言:糟糕的程式碼,對程式碼維護、效能、團隊協作都會造成負面影響,所以,先設計再實現,謀而後動。         這裡的迴圈查詢,指的是在一個for迴圈中,不斷訪問資料庫來查詢資料。在剛接手公司

人工智慧(mysql)—— mysql高階查詢(索引、連線

一、索引    1、索引的定義                對資料庫中表的一列或者多列的值進行排序的一種結構(MySQL中索引用Btree方式)    2、索引的優點                加快資料的檢索速度    3、索引的缺點                a、

Python Django 效能測試優化指南

唐納德·克努特(Donald Knuth)曾經說過:“不成熟的優化方案是萬惡之源。”然而,任何一個承受高負載的成熟專案都不可避免地需要進行優化。在本文中,我想談談優化Web專案程式碼的五種常用方法。雖然本文是以Django為例,但其他框架和語言的優化原則也是類似的。通過使用這些

java執行緒程式效能調優 優化過程

我, 一多年c++開發,由於專案原因需要對一個性能底下的多執行緒java程式進行調優,百度google了幾把,媽蛋,沒有發現指導如何java執行緒調優的文章啊,都是一些java使用規範,我去,那我大java的開發工程師都是怎麼調優的啊, 那我大C++工程師就帶領大家如何j

使用Android Profile做效能分析優化

前言 做Android開發五年,開發工具從最初的eclipse+ADT外掛到AndroidStduio。Google更是在新版的AndroidStudio中集成了Android應用效能分析利器——Profile。 本文基於AndroidStudio 3.2.1 正式版進行分析並定位問題原因。附上下載地址:

【FastDFS分散式檔案系統之二】:FastDFS小檔案上傳效能測試Python客戶端上傳操作

  由於要對比swift上傳小檔案以及fdfs上傳小檔案的效能,故做效能測試。 1.1 測試環境: FastDFS叢集的搭建方法:【FastDFS分散式檔案系統之一】:搭建、部署、配置 tracker server1:node2 tracker server2:node3

基於tk.mybatis:mapper實現的通用查詢,更新操作上傳jar到maven中心倉庫(一)

一、前言    本人使用mybatis也有些年頭了。對於mybatis的使用也有點個人的心得。個人感覺mybatis在使用起來比hibernate方便且輕量級,這也是我喜歡使用mybatis的原因之一。但是每次在過了一段時間之後就會出現mybatis的xml檔案裡面的sql語

php + nginx 網站併發壓力測試優化

一、測試工具: Apache 壓力測試工具ab ab是針對apache的效能測試工具,可以只安裝ab工具。 ubuntu安裝ab apt-get install apache2-utils centos安裝ab yum install h

查詢資料同時需要排序分頁

1、使用union SELECT * FROM ( SELECT 1 AS type, `name`, number, money FROM test1 UNION SELECT 2 AS type, `name`, number, money

ArrayList的contains()方法的效能問題優化方法

  今天在專案效能測試過程中發現,某處程式碼通過ArrayList的contains()方法來檢查某個給定值是否存在於該ArrayList中的效能非常低(該ArrayList中有10萬個元素)。然後開始著手對其進行優化,下面主要介紹ArrayList的conta

14 連線(hash join outer)--優化主題系列

外連線在分頁語句中有些特殊情況是無法優化的 left outer join與leftjoin等價 外連線(outerjoin) 外連線有三種,leftouter join,right outer j

基於Trie樹的模匹配演算法實現和優化

        1.多模匹配演算法簡介         多模式匹配在這裡指的是在"一個字串"中尋找"多個模式字元字串"的問題。一般來說,給出一個長字串和很多短模式字串,如何最快最省的求出哪些模式字串出現在長字串中是我們需要思考的(因為基本上大多數情況下是在給定的長字串中出