如何讓MySQL語句執行加速?

2022-07-13 13:51:09 字數 2147 閱讀 9122

一開啟科技類論壇,最常看到的文章主題就是mysql效能優化了,為什麼要優化呢?

因為:就是咱們說的「效能問題」,程式設計師一遇到它總是焦頭爛額!

今天對mysql優化總結了一些心得,希望在大家之後的工作中能有所有幫助!

like模糊查詢形如'%aaa%'和'%aaa'將不會使用索引,但是業務上不可避免可能又需要使用到這種形式。

通常的方法有兩種:

方案一:使用覆蓋索引,即查詢出的列只是用索引就可以獲取,而無須查詢表記錄,這樣也走了索引;

方案二:使用locate函式或者position函式代替like查詢,如table.field like '%aaa%'可以改為locate('aaa', table.field) > 0或position('aaa' in table.field)>0

如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in:例如:表a(小表),表b(大表)

示例一:

示例二:

如果查詢語句使用了not in 那麼內外表都進行全表掃瞄,沒有用到索引;而not exist 的子查詢依然能用到表上的索引。所以無論哪個表大,用not exists都比not in要快!

1)mysql 5.6 之前的版本對子查詢處理:不會將查詢的結果集計算出來用作與其他表做join,outer表每掃瞄一條資料,子查詢都會被重新執行一遍。

2)mysql 5.6 對子查詢的處理 :將子查詢的結果集 cache 到臨時表裡,臨時表索引主要用來移除重覆記錄,並且隨後也可能用於做join查詢,這種技術在 5.6 中叫做物化的子查詢,物化子查詢可以看到select_type欄位為subquery,而在 5.5 裡為dependent subquery。

3)子查詢一般都可以改成表的關聯查詢,子查詢會有臨時表的建立、銷毀,效率低下。

mysql hint:mysql 優化器在處理多表的關聯的時候,很有可能會選擇錯誤的驅動表進行關聯,導致了關聯次數的增加,從而使得sql語句執行變得非常的緩慢。

這個時候需要有經驗的dba進行判斷,選擇正確的驅動表,這個時候 straightjoin 就起了作用了,下面我們來看一看使用straight_join進行優化的案例。

嘗試採用user表做驅動表,使用straight_join強制連線順序:

# 高效分頁

1)傳統分頁

select * from table limit 10000,10

2)limit原理

3)推薦分頁

1、首先查詢返回的結果集,通常查詢返回的結果集很少,是有優化的空間的。

2、通過檢視執行計畫,檢視優化器選擇的驅動表,從執行計畫的rows可以大致反應出問題的所在。

3、搞清各表的關聯關係,檢視關聯字段是否有合適的索引。

5、如果條件允許,對複雜的sql進行拆分。盡可能越簡單越好。

有時優化器可能由於統計資訊不準確等原因,沒有選擇最優的執行計畫,可以人為改變mysql的執行計畫,例如:

按照效率排序的話,count(字段)mysql 效能優化 最主要是理解 innodb 的索引原理及結構及 sql 的執行計畫,在不斷累積經驗的基礎上熟能生巧。

mysql 語句在哪執行 MySQL語句執行過程

平常我們看到的只是一條語句執行出來的結果,並不知道中間發生了什麼,今天就來 一下,mysql語句的執行過程。1.聯結器 每次使用mysql會先連線到資料庫上面,聯結器負責跟客戶端進行連線 mysql u root p 然後根據密碼,判斷我登陸進去會有什麼許可權,並分配許可權給我 通過 show pr...

mysql如何跟蹤執行的sql語句

在sql server下跟蹤sql採用事件探查器,而在mysql下如何跟蹤sql呢?其實方法很簡單,開啟mysql的日誌log功能,通過檢視跟蹤日誌即可。開啟mysql的日誌log方法 windows環境下的配置方法 我使用的版本 version 5.0.37 community nt log my...

mysql如何跟蹤執行的sql語句

在sql server下跟蹤sql採用事件探查器,而在mysql下如何跟蹤sql呢?其實方法很簡單,開啟mysql的日誌log功能,通過檢視跟蹤日誌即可。開啟mysql的日誌log方法 windows環境下的配置方法 我使用的版本 version 5.0.37 community nt log my...