MySql筆記(索引)

2021-08-07 19:22:40 字數 2446 閱讀 2187

索引能優化資料庫查詢效能,但索引也有代價:

挑選索引應符合以下原則:

為用於搜尋、排序或分組的列建立索引,爾對於用作輸出顯示的列(select的結果)則不用。也就是說,最好是那些出現在where子句,連線子句,或者出現在order

bygroup by子句中的列

考慮資料列基數:列的基數是指列中非重複值的個數。例如對於性別的列,只包含』m』和』f』,索引操作幾乎沒用。如果當兩者出現的頻率大致一樣,當搜尋時,查詢優化程式會跳過索引去執行全表掃瞄。

盡量選用較小的資料型別。短小值可以讓比較操作更快,加快索引查詢速度、縮小空間開銷,減少磁碟的i/o請求。

根據上一條原則,若想要對字串進行索引,應盡可能指定字首長度,這樣可以節約大量索引空間——同時主要盡可能保證較多的基數

利用最左索引。當建立復合索引時,應合理利用索引中最左側的任意數列集合。

挑選合適的索引型別:大部分儲存引擎都會選擇預設的索引實現。但有時候也允許使用者自行選擇。比如雜湊值適合完成精確匹配(等於/不等於),但在查詢範圍值(大於小於/like)時表現不佳。

使用慢查詢日誌找出那些效能低劣的查詢。注意這個取決於伺服器的負載。高負載時會寫入更多的查詢。

合理地使用索引進行查詢:

使用相同的資料型別進行比較:例如,int/int比較,或者bigint/bigint比較會比int/bigint更快。同理可以認為char(10)varchar(10)是同型別的,但與char(12)是不同型別的。

索引列在表示式中單獨出現:如where col*2 < 4where col < 4/2在結果上等效,但對第一行,mysql會檢索每一行的col值,進行計算後與4比較,因此不會利用索引。而第二行可以利用索引的優勢。

再如:select * from table where year(date_col) < 1990中,表示式也不會把1990與索引值比較,而是取出每一行的資料計算yaer()後比較。如果想利用索引,可以使用明確日期值如select * from table where date_col < 1990-01-01避免在like模式的開始位置使用萬用字元:優化程式會檢視匹配模式的文字初始部分,並使用索引來找到匹配的行。但這種優化方式不能用於regexp運算子的模式匹配,regexp表示式絕不會被優化

如果子查詢執行的很慢,考慮用連線操作替換子查詢:由於子查詢是較晚出現的功能,因此優化程式對子查詢的支援稍弱。

避免過多的自動型別轉換:自動型別轉換可能會導致資料都轉換成更高精度(更長)的資料型別,從而降低效率。更糟糕的是,涉及型別轉換的比較可能阻止mysql使用索引(類似第二條)

優化查詢的思路

多用數字運算,少用字串運算:如比較運算時,數字之間比較可以在一次運算內完成,而字串需要依次比較多個位元組。

如果字串型別的取值個數有限,那麼可以選用enumset型別,這樣可以獲得數字運算帶來的好處。

避免使用較大的資料型別。

把資料列宣告成not null。因為在查詢處理期間,mysql不需要檢查該列是否為null,而不用再把null當做一種特例檢查。

使用procedure anaylyse():執行後可以看到,對適用於表裡各個列的優化資料型別給出了建議。

定期使用optimize table整理表碎片,

使用合成索引:可以通過md5()函式或sha1()crc32()根據表裡的其他列計算出乙個雜湊值並儲存到乙個單獨的列裡。不過,該技術僅適用於精確匹配查詢。合成雜湊索引對blobtext列非常有用。

blobtext剝離成一張單獨的表,在某些場合,從而使這個表的其他列轉換成固定長度的形式,能減少主表的碎片,提高檢索效率。

mysql索引 使用筆記 mysql索引筆記

mysql索引 一 索引的優缺點 優點 1.通過建立唯一索引,可以保證資料庫表中每一行的唯一性。2.可以大大加快查詢速度,這是建立索引的最主要原因 4.在使用分組和排序子句進行資料查詢時,也可以顯著減少查詢中分組和查詢的時間 缺點 1.建立索引和維護索引要耗費時間,並且隨著資料量的增加所耗費的時間也...

mysql索引筆記

型別 雜湊 雜湊演算法 原理 雜湊演算法 將各個資料重組成編號,查詢時將資料編號直接找到查詢到的值 優勢 一次性找到該值 劣勢 資料連續性差 中 編號 005 國 編號 006 人 編號 007 民 編號 008 如果查詢 中民 tree 二叉樹演算法 log2n 原理 當我查詢3時,此時4比3大走...

MySQL索引筆記

假設你在表的state city和zip資料列上建立了復合索引。索引中的資料行按照state city zip次序排列,因此它們也會自動地按照state city和state次序排列。這意味著,即使你在查詢中只指定了state值,或者指定state和city值,mysql也可以使用這個索引。因此,這...