精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當前位置:大數據數據庫 → 正文

MySQL使用索引的場景及真正利用索引的SQL類型

責任編輯:editor005 作者:haoke |來源:企業網D1Net  2015-05-20 14:18:26 本文摘自:個人博客

  1. 為什么使用索引

在無索引的情況下,MySQL會掃描整張表來查找符合sql條件的記錄,其時間開銷與表中數據量呈正相關。對關系型數據表中的某些字段建索引可以極大提高查詢速度(當然,不同字段是否selective會導致這些字段建立的索引對查詢速度的提升幅度不同,而且索引也并非越多越好,因為寫入或刪除時需要更新索引信息)。

對于MySQL的Innodb儲存引擎來說,大部分類型的index均以B-Tree數據結構的變種B+Tree來存儲(MEMORY類型的表還支持hash類型的索引)。B-Tree是數據庫或文件系統中常用的一種數據結構,它是一種N叉平衡樹,這種樹結構保證了同層節點保存的key有序,對于某個節點來說,其左子樹保存的所有key均小于該節點保存的 key,其右子樹保存的所有key均大于該節點保存的key。此外,在工程實現上,還結合操作系統的局部性原理做了很多優化,總之,b-tree的各種特性或優化技巧能保證:1) 查詢磁盤記錄時,讀盤次數最少;2) 任何insert和delete操作對樹結構的影響均很小;3) 樹本身的rebalance操作很高效。

2. MySQL使用索引的場景

MySQL在以下操作場景下會使用索引:

1) 快速查找符合where條件的記錄

2) 快速確定候選集。若where條件使用了多個索引字段,則MySQL會優先使用能使候選記錄集規模最小的那個索引,以便盡快淘汰不符合條件的記錄。

3) 如果表中存在幾個字段構成的聯合索引,則查找記錄時,這個聯合索引的最左前綴匹配字段也會被自動作為索引來加速查找。

例如,若為某表創建了3個字段(c1, c2, c3)構成的聯合索引,則(c1), (c1, c2), (c1, c2, c3)均會作為索引,(c2, c3)就不會被作為索引,而(c1, c3)其實只利用到c1索引。

4) 多表做join操作時會使用索引(如果參與join的字段在這些表中均建立了索引的話)

5) 若某字段已建立索引,求該字段的min()或max()時,MySQL會使用索引

6) 對建立了索引的字段做sort或group操作時,MySQL會使用索引

3. 哪些SQL語句會真正利用索引

從MySQL官網文檔"Comparison of B-Tree and Hash Indexes"可知,下面這些類型的SQL可能會真正用到索引:

1) B-Tree可被用于sql中對列做比較的表達式,如=, >, >=, <, <=及between操作

2) 若like語句的條件是不以通配符開頭的常量串,MySQL也會使用索引

比如,SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'或SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'可以利用索引,而SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'(以通配符開頭)和SELECT * FROM tbl_name WHERE key_col LIKE other_col(like條件不是常量串)無法利用索引。

對于形如LIKE '%string%'的sql語句,若通配符后面的string長度大于3,則MySQL會利用Turbo Boyer-Moore algorithm算法進行查找。

3) 若已對名為col_name的列建了索引,則形如"col_name is null"的SQL會用到索引

4) 對于聯合索引,sql條件中的最左前綴匹配字段會用到索引,示例請參考本文第2節第3條對聯合索引的說明

5) 若sql語句中的where條件不只1個條件,則MySQL會進行Index Merge優化來縮小候選集范圍

關鍵字:索引Mysqlrebalance

本文摘自:個人博客

x MySQL使用索引的場景及真正利用索引的SQL類型 掃一掃
分享本文到朋友圈
當前位置:大數據數據庫 → 正文

MySQL使用索引的場景及真正利用索引的SQL類型

責任編輯:editor005 作者:haoke |來源:企業網D1Net  2015-05-20 14:18:26 本文摘自:個人博客

  1. 為什么使用索引

在無索引的情況下,MySQL會掃描整張表來查找符合sql條件的記錄,其時間開銷與表中數據量呈正相關。對關系型數據表中的某些字段建索引可以極大提高查詢速度(當然,不同字段是否selective會導致這些字段建立的索引對查詢速度的提升幅度不同,而且索引也并非越多越好,因為寫入或刪除時需要更新索引信息)。

對于MySQL的Innodb儲存引擎來說,大部分類型的index均以B-Tree數據結構的變種B+Tree來存儲(MEMORY類型的表還支持hash類型的索引)。B-Tree是數據庫或文件系統中常用的一種數據結構,它是一種N叉平衡樹,這種樹結構保證了同層節點保存的key有序,對于某個節點來說,其左子樹保存的所有key均小于該節點保存的 key,其右子樹保存的所有key均大于該節點保存的key。此外,在工程實現上,還結合操作系統的局部性原理做了很多優化,總之,b-tree的各種特性或優化技巧能保證:1) 查詢磁盤記錄時,讀盤次數最少;2) 任何insert和delete操作對樹結構的影響均很小;3) 樹本身的rebalance操作很高效。

2. MySQL使用索引的場景

MySQL在以下操作場景下會使用索引:

1) 快速查找符合where條件的記錄

2) 快速確定候選集。若where條件使用了多個索引字段,則MySQL會優先使用能使候選記錄集規模最小的那個索引,以便盡快淘汰不符合條件的記錄。

3) 如果表中存在幾個字段構成的聯合索引,則查找記錄時,這個聯合索引的最左前綴匹配字段也會被自動作為索引來加速查找。

例如,若為某表創建了3個字段(c1, c2, c3)構成的聯合索引,則(c1), (c1, c2), (c1, c2, c3)均會作為索引,(c2, c3)就不會被作為索引,而(c1, c3)其實只利用到c1索引。

4) 多表做join操作時會使用索引(如果參與join的字段在這些表中均建立了索引的話)

5) 若某字段已建立索引,求該字段的min()或max()時,MySQL會使用索引

6) 對建立了索引的字段做sort或group操作時,MySQL會使用索引

3. 哪些SQL語句會真正利用索引

從MySQL官網文檔"Comparison of B-Tree and Hash Indexes"可知,下面這些類型的SQL可能會真正用到索引:

1) B-Tree可被用于sql中對列做比較的表達式,如=, >, >=, <, <=及between操作

2) 若like語句的條件是不以通配符開頭的常量串,MySQL也會使用索引

比如,SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'或SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'可以利用索引,而SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'(以通配符開頭)和SELECT * FROM tbl_name WHERE key_col LIKE other_col(like條件不是常量串)無法利用索引。

對于形如LIKE '%string%'的sql語句,若通配符后面的string長度大于3,則MySQL會利用Turbo Boyer-Moore algorithm算法進行查找。

3) 若已對名為col_name的列建了索引,則形如"col_name is null"的SQL會用到索引

4) 對于聯合索引,sql條件中的最左前綴匹配字段會用到索引,示例請參考本文第2節第3條對聯合索引的說明

5) 若sql語句中的where條件不只1個條件,則MySQL會進行Index Merge優化來縮小候選集范圍

關鍵字:索引Mysqlrebalance

本文摘自:個人博客

電子周刊
回到頂部

關于我們聯系我們版權聲明隱私條款廣告服務友情鏈接投稿中心招賢納士

企業網版權所有 ©2010-2024 京ICP備09108050號-6 京公網安備 11010502049343號

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 马山县| 新乡县| 盖州市| 玛曲县| 田阳县| 玉溪市| 陇川县| 垫江县| 民权县| 临江市| 双辽市| 巴里| 玉树县| 承德市| 武定县| 南安市| 平昌县| 金湖县| 枝江市| 邵东县| 柳江县| 丰镇市| 云霄县| 湘潭县| 永善县| 类乌齐县| 固安县| 手游| 北海市| 双鸭山市| 青铜峡市| 古丈县| 高清| 东乡县| 调兵山市| 和平县| 清镇市| 平安县| 泽库县| 米林县| 喜德县|