MySQL教程之查詢優化程式

2021-07-31 02:14:04 字數 2348 閱讀 1901

當你呼叫語句時,mysql會對它進行分析,判斷出可以使用哪些優化操作來加快處理速度。例如

select * from tab where false;
mysql會檢查子句,發現沒有符合查詢條件的行,就根本不會去搜尋表。通過執行explain可以看出

explain select * from tab where false;
分析表

生成關於鍵值分布情況的統計資料,它們可以幫助優化程式更準確的評估索引效率。

2. 使用explain驗證優化程式的操作

使用explain語句可以了解到各個索引是否會被用到

3. 在必要時給予優化程式提示或改寫它

在連線操作的表列表裡,可以在表名的後面加上force index、use index或ignore index,以告知伺服器期望使用哪些索引。

4. 比較擁有相同資料型別的列

如果頻繁進行比較的列擁有不同的型別,可以使用alter table語句修改其中的乙個。注:char(10)和varchar(10)是同型別的。而 char(10)和char(12)是不同型別的。

5. 讓索引列在比較表示式中單獨出現

如果索引的列是複雜表示式中的一部分,這在檢索時是不會使用索引的。

6. 不要在like模式的開始位置使用萬用字元(%)

7. 利用優化程式的長處

mysql支援連線和子查詢,但子查詢的支援是最近才開始有的功能,因此對於連線的優化要比使用子查詢的優化效果要更好一些。

8. 測試查詢的各種替代形式,並多次執行他們

9. 避免多次使用自動型別轉換

多用數字運算,少用字串運算

當較小型別夠用時,就不用較大型別

把資料列宣告成not null

如果資料列為not null,那麼處理速度會更快。這是因為在查詢處理期間,不在需要檢查該列的值是否為null,不用再把null當做一種特例去檢查。

4. 考慮使用enum列

如果字串列的基數低,則可以考慮換成enum列。

5. 使用procedure analyse()

select * from tab procedure analyse();
輸出結果裡會對表裡各個列的優化資料型別給出建議。

6. 整理表碎片

對於那些頻繁修改的表,尤其是那些包含有可變長度資料列的表,往往會產生大量的碎片,這會造成儲存表的磁碟塊空間的浪費。隨著時間的推移,需要讀取更多的磁碟塊,才能獲取有效的行。

定期使用optimize table,可以消除或減少碎片化的空間。碎片整理方法:先用mysqldump轉儲表,然後利用這個轉儲檔案重建它。

7. 把資料壓縮到blob或text列

使用blob或text列來儲存那些可在應用程式裡對其進行壓縮和解壓縮的資料,能夠達到使用單個檢索操作(而非多個操作)找出所有內容的目的。此辦法特別適用於儲存那些難以用標準表結構表示的資料,或者那些會隨時間變化的資料。

8. 使用合成索引

先根據表裡的其他列計算出乙個雜湊值,把它儲存到乙個單獨的列裡。然後通過搜尋雜湊值來檢索。不過這個技術只適用於精確匹配型查詢(運算子=)。

9. 避免使用很大的blob或text

10. 把blob或text列剝離出來形成乙個單獨的表

11. 儲存不大,但在速度上有要求的可以使用char型別

char 長度是固定的,不管你儲存的資料是多少他都會都固定的長度。而varchar則處可變長度但他要在總長度上加1字元,這個用來儲存位置。由於某種原因char 固定長度,所以在處理速度上要比varchar快速很多,但是對費儲存空間,所以對儲存不大,但在速度上有要求的可以使用char型別,反之可以用varchar型別來例項。

memory表使用固定長度行,char和varchar列都被隱式地當成char對待。

innodb 儲存引擎:建議使用varchar 型別。對於innodb 資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的char 列不一定比使用可變長度varchar 列效能要好。因而,主要的效能因素是資料行使用的儲存總量。由於char 平均占用的空間多於varchar,因此使用varchar 來最小化需要處理的資料行的儲存總量和磁碟i/o 是比較好的

資料化載入到資料庫還是有許多策略可以提高效率。

mysql的排程策略總結如下:

innodb儲存引擎利用行級的鎖定操作實現這種排程。在許多情況下,如唯讀的操作完成之時,innodb根本不使用鎖定操作。

myisam、merge和memory使用表鎖定,只要客戶端訪問表,就必須要先鎖定它,當這個客戶端完成對錶的操作時,才會解除鎖定(鎖定並不是讓其他人無法操作,多個客戶端可以同時讀)

MySQL優化教程之超大分頁查詢

基本上只要是做後台開發,都會接觸到分頁這個需求或者功能吧。基本上大家都是會用mysql的limit來處理,而且我現在負責的專案也是這樣寫的。但是一旦資料量起來了,其實limit的效率會極其的低,這一篇文章就來講一下limit子句優化的。很多業務場景都需要用到分頁這個功能,基本上都是用limit來實現...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...

mysql統計查詢優化 Mysql查詢優化

效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...