1. 程式人生 > >《高效能MySQL》讀書筆記--查詢效能優化

《高效能MySQL》讀書筆記--查詢效能優化

對於高效能資料庫操作,只靠設計最優的庫表結構、建立最好的索引是不夠的,還需要合理的設計查詢。如果查詢寫得很糟糕,即使庫表結構再合理、索引再合適,也無法實現高效能。查詢優化、索引優化、庫表結構優化需要齊頭並進,一個不落。

6.1 為什麼查詢速度會慢

通常來說,查詢的生命週期大致可以按照順序來看:從客戶端>>伺服器>>在伺服器上進行解析>>生成執行計劃>>執行>>返回結果給客戶端。其中執行可以認為是整個生命週期中最重要的階段,這其中包括了大量為了檢索資料到儲存引擎的呼叫以及呼叫後的資料處理,包括排序、分組等。瞭解查詢的生命週期、清楚查詢的時間消耗情況對於優化查詢有很大的意義。

6.2 優化資料訪問

查詢效能低下的最基本的原因是訪問的資料太多。大部分效能低下的查詢都可以通過減少訪問的資料量的方式進行優化。

1.確認應用程式是否在檢索大量超過需要的資料。這通常意味著訪問了太多的行,但有時候也可能是訪問了太多的列。

2.確認MySQL伺服器層是否在分析大量超過需要的資料行。

6.2.1 是否向資料庫請求了不需要的資料

請求多餘的資料會給MySQL伺服器帶來額外的負擔,並增加網路開銷,另外也會消耗應用伺服器的CPU記憶體和資源。這裡有一些典型案例:

1、查詢不需要的記錄:例如在新聞網站中取出100條記錄,但是隻是在頁面上顯示10條。實際上MySQL會查詢出全部的結果,客戶端的應用程式會接收全部的結果集資料,然後拋棄其中大部分資料。最簡單有效的解決方法就是在這樣的查詢後面加上LIMIT。

2、多表關聯時返回全部列,例如:


3、總是取出全部的列:每次看到SELECT *的時候都需要懷疑是不是真的需要返回全部的列?取出全部列,會主優化器無法完成索引覆蓋掃描這類優化,還會為伺服器帶來額外的IO、記憶體和CPU的消耗。如果應用程式使用了某種快取機制,或者有其他考慮,獲取超過需要的資料也可能有其好處,但不要忘記這樣做的代價是什麼。獲取並快取所有的列的查詢,相比多個獨立的只獲取部分列的查詢可能就更有好處。

4、重複查詢相同的資料:不要不斷地重複執行相同的查詢,然後每次都返回完全相同的資料。當初次查詢的時候將這個資料快取起來,需要的時候從快取中取出,這樣效能顯然更好。

6.2.2 MySQL是否在掃描額外的記錄

對於MySQL,最簡單的衡量查詢開銷的三個指標有:響應時間、掃描的行數、返回的行數。這三個指標都會記錄到MySQL的慢日誌中,所以檢查慢日誌記錄是找出掃描行數過多的查詢的好辦法。

響應時間

響應時間是兩個部分之和:服務時間和排隊時間,一般常見和重要的等待是IO和鎖等待。

掃描的行數和返回的行數

分析查詢時,檢視該查詢掃描的行數是非常有幫助的。一定程度上能夠說明該查詢找到需要的資料的效率高不高。理想的情況下掃描的行數和返回的行數應該是相同的。當然這只是理想情況。一般來說掃描的行數對返回的行數的比率通常很小,一般在1:1到10:1之間。

掃描的行數和訪問型別

MySQL有好幾種訪問方式可以查詢並返回一行結果。有些訪問方式可能需要掃描很多行才能返回一行結果,也有些訪問方式可能無須掃描就能返回結果。

在EXPLAIN語句的TYPE列返回了訪問型別。如果查詢沒有辦法找到合適的訪問型別,那麼解決的最好辦法通常就是增加一個合適的索引。索引讓MySQL以最高效、掃描行最少的方式找到需要的記錄。

一般MySQL能夠使用如下三種方式應用WHERE條件,從好到壞依次為:

1、在索引中使用WHERE條件來過濾不匹配的記錄。這是在儲存引擎層完成的。

2、使用索引覆蓋掃描(在extra列中出現了using index)來返回記錄,直接從索引中過濾不需要的記錄並返回命中的結果。這是在MySQL伺服器層完成的,但無須回表查詢記錄。

3、從資料表中返回資料,然後過濾不滿足條件的記錄(在extra列中出現using where)。這在MySQL伺服器層完成,MySQL需要先從資料表讀出記錄然後過濾。

6.3 重構查詢的方式

6.3.1 一個複雜查詢還是多個簡單查詢

MySQL內部每秒能夠掃描記憶體中上百萬行資料,相比之下,MySQL響應資料給客戶端就慢得多了。在其他條件都相同的時候,使用盡可能少的查詢當然是更好的。但是有時候,將一個大查詢分解為多個小查詢也是很有必要的。

6.3.2 切分查詢

有時候對於一個大查詢我們需要“分而治之”,對於刪除舊資料,如果用一個大的語句一次性完成的話,則可能需要一次性鎖住很多資料、佔滿整個事務日誌、耗盡系統資源、阻塞很多小的但重要的查詢。將一個大的DELETE語句切分成多個較小的查詢可以儘可能小地影響MySQL效能,同時還可以減少MySQL複製的延遲。例如我們需要每個月執行一次下面的查詢:

那麼可以用類似下面的辦法來完成同樣的工作:

相關推薦

高效能MySQL】第六章查詢效能優化 查詢優化器侷限

剛才誤關了瀏覽器,啊~~~ 6.5MySQL查詢優化器侷限性 6.5.1關聯子查詢 where子查詢實現的非常糟糕,最糟一類where包含in 優化: exists等效改寫: 或使用group_concat()在in中構造由逗號分隔的列表:【源】    

高效能mysql讀書筆記(一)

1 mysql的架構與歷史: 1.1 mysql邏輯架構 mysql將查詢等處理與資料儲存相分離的,可以更加靈活的選取資料儲存的方式。mysql處理架構:連線處理->解析器->查詢快取->優化器->儲存引擎。 第一層:連線處理:包括主要的授權登入、安

高效能MySQL.讀書筆記(六)高可用性

什麼是高可用性 每個應用對可用性的需求各不相同。在設定一個可用時間的目標之前,先問問自己,是不是確實需要達到這個目標。可用性每提高一點,所花費的成本都會遠超之前;可用性的效果和開銷的比例並不是線性的。需要保證多少可用時間,取決於能夠承擔多少成本。高可用性實際上是在宕機造成的

高效能MySQL.讀書筆記(一)優化伺服器設定

MySQL有大量可以修改的引數——但不應該隨便去修改。通常只需要把基本的配置項配置正確(大部分情況下只有很少一些引數是真正重要的),應該將更多的時間花在schema的優化、索引,以及查詢設計上。 確保基本的配置是正確的,如果碰到了問題,並且問題是由於伺服器的某部分導致的,而這恰好可以通過某個配置項解決,那麼需

高效能mysql讀書筆記(四)

四,建立高效能的索引 索引也稱為鍵,索引是一種查詢資料有用的資料結構,索引優化是查詢優化中最優效的手段。 索引可以包含一列或者多列,mysql能夠高效的使用索引中的最左字首列,索引在儲存引擎層實現,不同的儲存引擎有不同的索引。B-tree索引作為大多數資料庫的索引資料結構,

高效能MySQL.讀書筆記(二)作業系統和硬體優化

使用Flashcache 雖然有很多因素需要在快閃記憶體、硬碟和RAM之間權衡,在儲存層次結構中,這些裝置沒有被當作一個整體處理。有時可以使用磁碟和記憶體技術的結合,這就是Flashcache。 Flashcache是一個Linux核心模組,使用Linux的裝置對映器(Device Mapper)。它在記憶體

Mysql 索引 與 多表查詢效能優化

最近做專案需要用到Luence Whoosh,要定時從資料庫中索引出資料來供檢索,但是在索引中設計多表查詢,速度較慢,因為強迫症,想要做效能優化,因此把Mysql的核心又翻出來研究一遍。 關於MySQL索引的好處,如果正確合理設計並且使用索引的MySQL是一輛蘭博基尼的話,那麼

高效能MySQL讀書筆記查詢效能優化

對於高效能資料庫操作,只靠設計最優的庫表結構、建立最好的索引是不夠的,還需要合理的設計查詢。如果查詢寫得很糟糕,即使庫表結構再合理、索引再合適,也無法實現高效能。查詢優化、索引優化、庫表結構優化需要齊頭並進,一個不落。6.1 為什麼查詢速度會慢通常來說,查詢的生命週期大致可以

MySQL讀書學習筆記(四)——查詢效能優化

4.1 為什麼慢瞭解查詢的生命週期,清楚查詢的時間消耗情況對於優化查詢有很大意義。4.2 慢查詢基礎:優化資料訪問查詢效能低下最基本的原因是訪問資料太多。某些查詢可能不可避免地需要篩選大量資料,但這並不常見。大部分效能低下的查詢都可以通過減少訪問的資料量的方式進行優化。對於低

MySQL讀書筆記事務日誌,MySQL中的事務

WLA(Write-Ahead Logging) 事務日誌,可以幫助提高事務的效率。使用事務日誌,儲存引擎在修改表的資料時,只需要修改其記憶體拷貝,再把該修改行為記錄到硬碟上的事務日誌中,而不用每次都將修改的資料本身持久到磁碟。事務日誌採用的是追加的方式,因此

高效能Mysql------------查詢效能優化

查詢優化,索引優化,庫表結構優化需要齊頭並進。 查詢效能低下最基本的原因是訪問的資料太多了。可以通過下面兩個步驟來分析: 1.是否檢索大量超過需要的資料 2.是否在分析大量超過需要的資料行 請求了不需要的資料 1)查詢不需要的記錄 最簡單的解決方法是在查詢後面加limit 2)多

讀薄《高效能MySql》(四)查詢效能優化

讀薄《高效能MySql》(四)查詢效能優化 讀薄《高效能MySql》(一)MySql基本知識讀薄《高效能MySql》(二)Scheme與資料優化讀薄《高效能MySql》(三)索引優化讀薄《高效能MySql》(四)查詢效能優化 對 MySql 進行優化,必須對 Scheme,索引,查詢語句一同

高效能MySQL》---查詢效能優化

本篇深入瞭解查詢優化和伺服器的內部機制,瞭解MySql如何執行特定查詢,從中也可以知道如何更改查詢執行計劃,當我們深入理解MySql如何真正地執行查詢,明白高效和低效的真正含義,在實際應用中就能揚長避短。宣告:本人使用的資料庫版本為MySql 5.1一、基本原則:優化資料訪問

Hadoop權威指南讀書筆記(1) MapReduce和HDFS簡介

最近開始讀<< Hadoop:the definitive guide>>,於是打算寫點讀書筆記,書電子版見網盤,密碼v66s。 原書推薦的讀書順序如下圖: 這裡我們就按從第一章到最後一章的順序讀吧. Chapter 2:

MySQL分頁查詢效能優化

當需要從資料庫查詢的表有上萬條記錄的時候,一次性查詢所有結果會變得很慢,特別是隨著資料量的增加特別明顯,這時需要使用分頁查詢。對於資料庫分頁查詢,也有很多種方法和優化的點。下面簡單說一下我知道的一些方法。 準備工作 為了對下面列舉的一些優化進行測試,下面針對已有的一張表進行說明。 表名:order

學習《高效能MySQL筆記-索引篇

1.索引釋義: 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取資訊。比如書本的目錄,那幾頁目錄就是索引內容,目錄中的維度比如“章節名稱”、“首字母”對應的就

Mysql資料庫效能優化查詢效能優化

一、前言:為啥查詢速度會變慢? 通常來說,查詢的生命週期大致分為從客戶端、到伺服器,然後在伺服器上進行解析,生成執行計劃,執行,並返回結果給客戶端。其中執行可以說是最重要的階段,這其中包括了大量為了檢索資料到儲存引擎的呼叫以及呼叫後的資料處理,包括排序和分組等。在每一個消耗大量時間的查

高效能MySQL筆記——MySQL建表資料型別的選擇

前段時間看了《高效能MySQL》中的選擇優化的資料型別,這裡主要是做一下筆記。 首先資料選擇有幾個簡單原則: 更小的通常更好。一般情況下,應該儘量使用可以正確儲存資料的最小資料型別。例如只需要存 0~200,tinyint unsigned 更好。更小的資料型別通常更快,因為它們佔

高效能MySQL 個人筆記

# 寫作目的 最近讀了《高效能MySQL_第3版(中文)》決定寫一篇專門的部落格來記錄所學所得,以及記錄自己平時的積累經驗,並傳播給大家。 # 儲存引擎 ## MyISAM 單獨存放行數資訊(count(*)不帶篩選條件時不用讀表);   支援表鎖,不支援行鎖;   不支援

mysql學習筆記--巢狀子查詢和相關子查詢

子查詢:巢狀在其他查詢中的查詢稱之。   子查詢又稱內部,而包含子查詢的語句稱之外部查詢(又稱主查詢)。   所有的子查詢可以分為兩類,即相關子查詢和非相關子查詢   1. 非相關子查詢是獨立於外部查詢的子查詢,子查詢總共執行一次,