mysql篩選第二條字段 MySql索引總結

2021-10-22 10:10:19 字數 2501 閱讀 7225

索引的數學原理

索引的實現是b+樹,型別的資料結構,b+樹內節點不存data,只存key;葉子節點不儲存指標。利用磁碟預讀區域性性原理,一次i\/o操作多個頁(4k)到記憶體,資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i\/o就可以完全載入。b-tree中一次檢索最多需要h-1次i\/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。

聚集索引和非聚集索引

在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的。

myisam

myisam引擎使用b+tree作為索引結構,葉節點的data域存放的是資料記錄的位址。在myisam中,主索引和輔助索引(secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。myisam中索引檢索的演算法為首先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其data域的值,然後以data域的值為位址,讀取相應資料記錄。

innodb

innodb的資料檔案本身就是索引檔案,b+樹的葉節點data域儲存了完整的資料記錄,這種索引叫做聚集索引。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。innod的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵,如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

innodb的輔助索引data域儲存相應記錄主鍵的值而不是位址,輔助索引都引用主鍵作為data域。

建索引規則

盡量為搜尋、分組的資料編寫索引,例如where,join,order by和group by

考慮索引選擇性:所謂索引的選擇性(selectivity),是指不重複的索引值(也叫基數,cardinality)與表記錄數(#t)的比值 index selectivity = cardinality/#t

字串值可以考慮字首索引

聯合索引的情況下,考慮最左字首匹配

適可而止

索引優化

使用explain命令檢視select命令執**況,考慮以下優化情況

盡量使用相同資料型別比較

帶索引的資料列在表示式,函式中單獨出現,例如,下面兩個語句(oracle): where to_days(date_col) - to_days(curdate) < cutoff

where date_col < date_add(curdate(), interval cutoff day)

第二條就能用上date_col上的索引

不要在like模式開始的時候使用萬用字元』%』

避免過多使用mysql的自動型別轉換功能:例如字串表示的整型數字

其他問題

索引覆蓋 covering index

mysql可以利用索引返回select列中的字段,而不必根據索引再次讀取檔案,包含所有滿足查詢需要的資料的索引稱為覆蓋索引。在explain的時候,輸出的extra資訊中如果有using index,就表示這條查詢使用了覆蓋索引。

query cache原理

當mysql接收到一條select型別的query時,會對這條query進行hash計算而得到乙個hash值,然後通過該hash值到query cache中去匹配,如果沒有匹配中,則將這個hash值存放在乙個hash鍊錶中,同時將query的結果集存放進cache中,存放hash值的鍊錶的每乙個hash節點存放了相應query結果集在cache中的位址,以及該query所涉及到的一些table的相關資訊;如果通過hash值匹配到了一樣的query,則直接將cache中相應的query結果集返回給客戶端。如果mysql任何乙個表中的任何一條資料發生了變化,便會通知query cache需要與該table相關的query的cache全部失效,並釋放占用的記憶體位址。

應該避免在變化頻繁的table上使用query cache

通過設定欄位variable變數開啟或者關閉query cache

set profiling = 1;

set query_cache_type = 0;

set global query_cache_size = 0;

index condition pushdown(icp)

icp的原理簡單說來就是將可以利用索引篩選的where條件在儲存引擎一側進行篩選,而不是將所有index access的結果取出放在server端進行where篩選。聯合索引情況下,icp只能作用於二級索引。mysql預設開啟

通過設定引數set optimizer_switch='index_condition_pushdown=off';關閉icp

在不支援icp的系統下,索引僅僅作為data access使用。

在icp優化開啟時,在儲存引擎端首先用索引過濾可以過濾的where條件,然後再用索引做data access,被index condition過濾掉的資料不必讀取,也不會返回server端。

參考文獻

星 辰 第 二 條 約 定

1 關係圖 2 遊戲設計 輸入s建正式開始遊戲,一開始只有乙個敵人,當你按下w或s時,它會在隨機位置生成敵人,你的任務是吃掉敵人。當地圖上乙個敵人都沒有的時候,你就贏了。3 問題 一開始想實現敵人隨機移動,還有隨機生成的五個食物,碰到敵人則遊戲就輸了。但是敵人隨機移動的 查了很久也想了很久沒搞出來。...

sql查詢從第二條開始

從資料庫中查詢前9條,從第二條輸出 select top 9 from biao where id not in select top 1 id from biao 那麼以此類推 從資料庫中查詢前9條,從第三條輸出 select top 9 from biao where id not in sel...

第二條 遇到多個構造器引數時要考慮用構建器

構造方法中傳遞的引數一般是必要引數,如果乙個類,有必要的屬性,還有可選的屬性,那可用builder構造器 建立對應的類 例 類nutrition 有必要屬性servings,servings,可選屬性為calories,fat,sodium,carbohydrate public class nut...