mysql locate索引 MYSQL索引優化

2021-10-18 01:10:27 字數 2929 閱讀 4722

1.檢視sql的執行頻率

mysql 客戶端連線成功後,通過 show [session|global] status 命令可以提供伺服器狀態資訊。show [session|global] status 可以根據需要加上引數「session」或者「global」來顯示 session 級(當前連線)的計結果和 global 級(自資料庫上次啟動至今)的統計結果。如果不寫,預設使用引數是「session」。

2.定位效率底下的sql

可以通過以下兩種方式定位執行效率較低的 sql 語句。

慢查詢日誌 : 通過慢查詢日誌定位那些執行效率較低的 sql 語句,用--log-slow-queries[=file_name]選項啟 動時,mysqld 寫乙個包含所有執行時間超過 long_query_time 秒的 sql 語句的日誌檔案。具體可以檢視本 書第 26 章中日誌管理的相關部分。

show processlist : 慢查詢日誌在查詢結束以後才紀錄,所以在應用反映執行效率出現問題的時候查詢慢查詢 日誌並不能定位問題,可以使用show processlist命令檢視當前mysql在進行的執行緒,包括執行緒的狀態、是否 鎖表等,可以實時地檢視 sql 的執**況,同時對一些鎖表操作進行優化。

3.explain分析執行計畫

type 顯示的是訪問型別,是較為重要的乙個指標,可取值為:

一般來說, 我們需要保證查詢至少達到 range 級別, 最好達到ref 。

mysql從5.0.37版本開始增加了對 show profiles 和 show profile 語句的支援。show profiles 能夠在做sql優化時 幫助我們了解時間都耗費到**去了。

4.索引的使用

如果索引了多列,要遵守最左字首法則。指的是查詢從索引的最左前列開始,並且不跳過索引中的列。 匹配最左字首法則,走索引。

不要在索引列上進行運算操作, 索引將失效。

字串不加單引號,造成索引失效。

盡量使用覆蓋索引(只訪問索引的查詢(索引列完全包含查詢列)),減少select * 。

用or分割開的條件, 如果or前的條件中的列有索引,而後面的列中沒有索引,那麼涉及的索引都不會被用到。

以%開頭的like模糊查詢,索引失效。 如果僅僅是尾部模糊匹配,索引不會失效。如果是頭部模糊匹配,索引失效。通過覆蓋索引可解決。

如果mysql評估使用索引比全表更慢,則不使用索引。

in 走索引, not in 索引失效。

is null , is not null 有時索引失效。

盡量使用復合索引,而少使用單列索引 。單列索引資料庫會選擇乙個最優的索引(辨識度最高索引)來使用,並不會使用全部索引 。

5.插入資料優化

對於 innodb 型別的表,有以下幾種方式可以提高匯入的效率:

因為innodb型別的表是按照主鍵的順序儲存的,所以將匯入的資料按照主鍵的順序排列,可以有效的提高匯入數 據的效率。如果innodb表沒有主鍵,那麼系統會自動預設建立乙個內部列作為主鍵,所以如果可以給表建立乙個 主鍵,將可以利用這點,來提高匯入資料的效率。

在匯入資料前執行 set unique_checks=0,關閉唯一性校驗,在匯入結束後執行set unique_checks=1,恢 復唯一性校驗,可以提高匯入的效率。

如果應用使用自動提交的方式,建議在匯入前執行 set autocommit=0,關閉自動提交,匯入結束後再執行 set autocommit=1,開啟自動提交,也可以提高匯入的效率。

insert優化:

如果需要同時對一張表插入很多行資料時,應該盡量使用多個值表的insert語句,這種方式將大大的縮減客戶 端與資料庫之間的連線、關閉等消耗。使得效率比分開執行的單個insert語句快。

在事務中進行資料插入。

資料有序插入。

6.order by語句優化:

兩種排序方式

1). 第一種是通過對返回資料進行排序,也就是通常說的 filesort 排序,所有不是通過索引直接返回排序結果的排序 都叫 filesort 排序。

2). 第二種通過有序索引順序掃瞄直接返回有序資料,這種情況即為 using index,不需要額外排序,操作效率高。

了解了mysql的排序方式,優化目標就清晰了:儘量減少額外的排序,通過索引直接返回有序資料。where 條件 和order by 使用相同的索引,並且order by 的順序和索引順序相同, 並且order by 的字段都是公升序,或者都是 降序。否則肯定需要額外的操作,這樣就會出現filesort。

如果查詢包含 group by 但是使用者想要避免排序結果的消耗, 則可以執行order by null 禁止排序。

7.優化巢狀查詢

mysql4.1版本之後,開始支援sql的子查詢。這個技術可以使用select語句來建立乙個單列的查詢結果,然後把 這個結果作為過濾條件用在另乙個查詢中。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的sql 操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。但是,有些情況下,子查詢是可以被更高效的連線 (join)替代。連線(join)查詢之所以更有效率一些 ,是因為mysql不需要在記憶體中建立臨時表來完成這個邏輯上需要兩個步驟的 查詢工作。優化or條件

對於包含or的查詢子句,如果要利用索引,則or之間的每個條件列都必須用到索引 , 而且不能使用到復合索 引; 如果沒有索引,則應該考慮增加索引。union 語句的 ref 值為 const,or 語句的 type 值為 null,const 表示是常量值引用,非常快 這兩項的差距就說明了 union 要優於 or 。

9.優化分頁查詢

一般分頁查詢時,通過建立覆蓋索引能夠比較好地提高效能。在索引上完成排序分頁操作,最後根據主鍵關聯回原表查詢所需要的其他列內容。也可以對於主鍵自增的表,可以把limit 查詢轉換成某個位置的查詢 。

談談mysql locate函式

測試環境插入如上資料 場景1,我麼需要查詢所有名字中含有 王 的所有資料,用like很簡單 select from user where name like 王 order by id 那麼使用locate如何去實現呢,首先我們先看看locate的用法,如下為官方給出的該函式的詳細使用說明 意思也比...

My程式設計修煉之道

最近想法有點多,已經大三末期的我思緒萬千,對於現在所在的路以及將來要走的路充滿著困惑於不解,但是有一點我是可以確定的,畢業之後我將要從事的行業必然是計算機行業。對於乙個沒有關係,沒有背景我來說,畢業的第一選擇必然是大學所學的專業了。大學裡辛辛苦苦學了四年的專業不能說丟就丟吧,畢竟人的一生能有幾個四年...

Mysql Workbench建模匯入MySQL中

我不知道其他人怎麼做。這個只是我自己摸索的做法。1.workbench中匯出sql檔案。file,export。一直下一步 當然也可以選一些東西 2.處理workbench出來的sql檔案。例如開頭一些set,結尾一些set貌似沒用。刪了。然後字元編碼也要處理一下,預設好像是latin1。這裡最好複...