mysql索引隨記

為什么80%的碼農都做不了架構師?>>> ??hot3.png

先了解下Btree:https://my.oschina.net/u/3646190/blog/1593094

為什么每個數據項,即索引字段要盡量的小,比如int占4字節,要比bigint8字節少一半?

通過上面的分析,我們知道IO次數取決于b+數的高度h,假設當前數據表的數據為N,每個磁盤塊的數據項的數量是m,則有h=㏒(m+1)N,當數據量N一定的情況下,m越大,h越小;而m = 磁盤塊的大小 / 數據項的大小,磁盤塊的大小也就是一個數據頁的大小,是固定的,如果數據項占的空間越小,數據項的數量越多,樹的高度越低,查詢速度越快。

為什么b+樹要求把真實的數據放到葉子節點而不是內層節點?

一旦放到內層節點,磁盤塊的數據項會大幅度下降,導致樹增高。當數據項等于1時將會退化成線性表。

索引的最左匹配特性

當b+樹的數據項是復合的數據結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪里查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等于張三的數據都找到,然后再匹配性別是F的數據了

建索引的幾大原則

1.最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0,那可能有人會問,這個比例有什么經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄

4.索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可

-------------------------------------------------------------------------------------------------------------

如果在firstname、lastname、age這三個列上分別創建單列索引,效果是否和創建一個firstname、lastname、age的多列索引一樣呢?

答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。

索引只保存一個或多個組合字段并不是所有的字段。

很好的一篇文章?MyISAM和InnoDB索引對比

?InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一種非常快速的主鍵查找性能。不過,它的輔助索引(Secondary Index, 也就是非主鍵索引)也會包含主鍵列,所以,如果主鍵定義的比較大,其他索引也將很大。如果想在表上定義 、很多索引,則爭取盡量把主鍵定義得小一些。InnoDB 不會壓縮索引。

? ? ? 文字符的ASCII碼作為比較準則。聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

?

?InnoDB索引MyISAM索引的區別:

一是主索引的區別,InnoDB的數據文件本身就是索引文件。而MyISAM的索引和數據是分開的。

二是輔助索引的區別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。

轉載于:https://my.oschina.net/suyain/blog/1573559

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode79. 單詞搜索(回溯算法)

給定一個二維網格和一個單詞&#xff0c;找出該單詞是否存在于網格中。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 示例: board [ [‘A’,‘…

react鉤子_迷上了鉤子:如何使用React的useReducer()

react鉤子So the React Conference just happened and as always something new happened. Hooks happened! The React team talked about suspense, lazy loading, concurrent rendering, and hooks :D.因此&#xff0c;React會議剛剛發生&#xff0c;并且一如既往地發生了一些…

開發注意事項

明確需求 - 溝通 - 定好上下游接口 次序亂不得轉載于:https://www.cnblogs.com/zslzz/p/6802437.html

c語言寫桌面程序unity,Unity和iOS原生界面交互示例

注意上面的Main方法中出現的UnityAppController&#xff0c;該類就是作為控制類來實現Unity在iOS上顯示的功能&#xff0c;在Main方法中就是將該控制器作為參數傳遞&#xff0c;即Main方法之后就會進入該類執行。所以這是我們進入到UnityAppController.mm&#xff0c;來查看該類…

oracle審計實施

1、語句審計 Audit session; Audit session By ; 與instance連接的每個會話生成一條審計記錄。審計記錄將在連接時期插入并且在斷開連接時期進行更新。 保留有關會話的信息比如連接時期斷開連接時期處理的邏輯和物理I/O&#xff0c;以及更多信息將存儲在單獨一條審計 記錄中…

JPDA 架構研究5 - Agent利用環境指針訪問VM (內存管理篇)

引入&#xff1a; 我們在前面說到JVMTI的客戶端Agent,又提到Agent通過環境指針來訪問VM。這里就來看看環境指針到底有多大的訪問VM的能力。 分類1&#xff1a;內存管理 a.Allocate. 分配內存 jvmtiError Allocate(jvmtiEnv* env,jlong size,unsigned char** mem_ptr) size:分配…

leetcode94. 二叉樹的中序遍歷(dfs)

給定一個二叉樹&#xff0c;返回它的中序 遍歷。示例:輸入: [1,null,2,3]1\2/3輸出: [1,3,2]代碼 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class …

vtk刪除一個actor_如何構建一個基于actor的簡單區塊鏈

vtk刪除一個actorScalachain is a blockchain built using the Scala programming language and the actor model (Akka Framework).Scalachain是使用Scala編程語言和參與者模型( Akka Framework )構建的區塊鏈。 In this story I will show the development process to build…

java枚舉的簡單介紹

1.枚舉&#xff0c;enum關鍵字&#xff0c;相當于public final static. 2.舉例&#xff1a; 首先定義了一個名為spiciness的枚舉類型。 public enum Spiciness {NOT, MILD, MEDIUM, HOT, FLAMING } 再來測試一下enum&#xff0c;這個測試方法表明它有tostring()方法&#xff0…

瀏覽器中插入富文本編輯器

常用的富文本編輯器有CKEditor、UEEditor、TinyEditor、KindEditor等、以下以kindeditor編輯器的使用為例。 1.官網下載KindEditor編輯器http://kindeditor.net/down.php&#xff0c; 當前最新版本為4.1.11&#xff0c;解壓縮后放入項目的static目錄&#xff0c;作為js插件引用…

獲取Extjs文本域中的內容

經常在Ext.select()和Ext.query()等問題上糾結&#xff0c;今天終于有了點新認識&#xff1a; 需求&#xff0c;假設我們的頁面上有個panel ,其id為clusterstab_edit_details,這個panel的內部有個textarea,這個textarea的name為editDetails_Description,那么我們有多少方法可以…

android觸摸指紋會觸發按鍵功能,Android P新特性:利用觸摸指紋識別器能阻止手機息屏...

設想你正在閱讀手機上的文章&#xff0c;突然間顯示屏變暗了一點。顯然&#xff0c;你設置的30秒或1分鐘超時息屏對于常規使用來說還可以&#xff0c;但對于閱讀純文本片段&#xff0c;還遠遠不夠。因此&#xff0c;這時你會輕觸屏幕&#xff0c;可能會上下滑動&#xff0c;以防…

leetcode37. 解數獨(hashmap+回溯)

編寫一個程序&#xff0c;通過已填充的空格來解決數獨問題。 一個數獨的解法需遵循如下規則&#xff1a; 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 空白格用 ‘.’ 表示。 Note: 給定的數獨序…

malloc、calloc、realloc和alloca各種的區別

需要先包含頭文件 #include"malloc.h"malloc是標準的在堆中開辟新的空間比如char *pt(char *)malloc(10*sizeof(char));需要free(p)才會釋放空間calloc也是開辟空間&#xff0c;但是使用方式不一樣比如char *pt(char *)calloc(100, sizeof(char));然后用calloc開辟的…

如何對第一個Vue.js組件進行單元測試

by Sarah Dayan通過莎拉達揚 In Build Your First Vue.js Component we made a star rating component. We’ve covered many fundamental concepts to help you create more complex Vue.js components.在“ 構建您的第一個Vue.js組件”中&#xff0c;我們制作了星級評分組件…

Asp.NetCoreWebApi - RESTful Api

REST 常用http動詞 WebApi 在 Asp.NetCore 中的實現3.1. 創建WebApi項目.3.2. 集成Entity Framework Core操作Mysql 3.2.1. 安裝相關的包(為Xxxx.Infrastructure項目安裝)3.2.2. 建立Entity和Context3.2.3. ConfigureService中注入EF服務3.2.4. 遷移數據庫3.2.5. 數據庫遷移結果…

android動畫影子效果,Android TV常用動畫的效果,View選中變大且有陰影(手機也能用)...

因為電視屏幕比較大&#xff0c;而我們看電視時距離電視有一定距離&#xff0c;這樣就需要動畫效果比較明顯&#xff0c;這個動畫就是應用最廣泛的&#xff0c;因為很酷&#xff0c;呵呵&#xff0c;你懂得&#xff0c;看了就知道。效果如下圖&#xff1a;public class MainAct…

leetcode226. 翻轉二叉樹(dfs)

翻轉一棵二叉樹。示例&#xff1a;輸入&#xff1a;4/ \2 7/ \ / \ 1 3 6 9 輸出&#xff1a;4/ \7 2/ \ / \ 9 6 3 1代碼 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode righ…

Java BigDecimal Rounding Mode

UP        往絕對值大了取 DOWN      往絕對值小了取 CEILING     往值大了取 FLOOR      往值小了取 HALF_UP     不管正負&#xff0c;四舍五入 HALF_DOWN  不管正負&#xff0c;五舍六入 HALF_EVEN    整數部分為奇數&#xff1a;四舍五入…

如何成為一名有效的軟件工程師

by Luis Santiago路易斯圣地亞哥(Luis Santiago) 如何成為一名有效的軟件工程師 (How to become an effective software engineer) When I first started my journey as a software engineer I quickly noticed the great amount of cognitive load involved when working on …