操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    今天給大家分享的是大數據開發基礎部分MySQL的索引篇,這篇內容大家一定要跟著練習,不然等于白看!

    索引是什么?

    在日常開發中常常會遇到查詢比較慢的情況,我們的第一反應就是給它加索引,那索引是什么呢?官方介紹索引是幫助MySQL高效獲取數據的數據結構,數據庫索引好比是一本書的目錄,能加快數據庫的數據查詢速度。

    那索引的好處有哪些呢?

    它可以提高數據檢索的效率,降低數據庫的成本。通過索引對數據進行排序,降低數據排序的成本表可以沒有主鍵嗎,降低CPU消耗。

    任何事情都會有正反面,索引也不例外,那索引的壞處有哪些呢?

    索引會占據磁盤空間。索引雖然會提高查詢效率,但會降低更新表的效率。MySQL不僅要保存數據,還有保存或者更新對應的索引文件。

    那是不是有壞處就不用索引呢?

    當然不是,索引必須拿來。一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往是存儲在磁盤文件上的文件中。

    索引的分類單列索引:普通索引:add 唯一索引:索引列中的值必須是唯一的,但允許有空值,add index主鍵索引:是一種特殊的唯一索引,不允許有空值組合索引:在表中的多個字段組合上創建的索引組合索引的使用,需要遵循最左前綴原則一般情況下表可以沒有主鍵嗎,建議使用組合索引代替單列索引(主鍵索引除外)全文索引:只有在、上才能使用,而且只能在char、、text類型字段上使用全文索引。空間索引:一般用不到索引的使用

    創建索引

    CREATE?INDEX?index_name?ON?table(column(length))?;

    刪除索引

    DROP?INDEX?index_name?ON?table;

    查看索引

    SHOW?INDEX?FROM?table_name?\G;

    索引原理(重點)索引的存儲結構

    說索引原理之前,先說說索引存儲結構。索引是在存儲引擎中實現的,也就是不同的存儲引擎,會使用不同索引。其中和只支持B+數索引,老劉先不講B樹和B+樹的概念,大家自行搜索。

    接下來就是索引的重點,搞清楚了非聚集索引和聚集索引,索引原理就差不多了!

    非聚集索引()

    它說的是B+樹葉子節點只會存儲數據行(數據文件)的指針,即數據和索引不在一起。它包含主鍵索引和輔助索引,都會存儲指針的值。

    主鍵索引

    中B+樹葉子節點存儲的數據是數據的指針值,通過索引樹找到對應的索引,然后通過索引中存儲的記錄指針,找到數據文件中對應的記錄。

    輔助索引(次要索引)

    在中,主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key是可以重復的。

    聚集索引()

    主鍵索引

    在中要求表必須有主鍵(可以沒有),如果沒有顯示指定,則MySQL系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則MySQL自動為表生成一個隱含字段作為主鍵類型為長整形。

    上圖是 主索引(同時也是數據文件)的示意圖,可以看到葉節點包含了完整的數據記錄,這種索引叫做聚集索引。因為 的數據文件本身要按主鍵聚集。

    輔助索引

    的輔助索引 data 域存儲相應記錄主鍵的值而不是地址。換句話說, 的所有輔助索引都引用主鍵作為 data 域。

    聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄,即回表查詢。

    select?*?from?user?where?name='Alice'

    根據這段SQL語句,會進行回表查詢,檢索兩次,才會獲得記錄。回表性能比較低,盡量做到不回表。

    索引使用場景

    介紹完索引的相關概念后,老劉必須給講講哪些場景下可以使用場景,大家記幾個就行。

    哪些情況下需要使用索引

    主鍵自動建立唯一索引頻繁作為查詢條件的字段應該創建索引多表關聯查詢中,關聯字段應該創建索引查詢中排序的字段應該創建索引頻繁查詢字段查詢中統計或者分組字段應該創建索引

    哪些情況下不需要創建索引

    表記錄太少,沒必要創建索引經常進行增刪改的表頻繁更新的字段where條件里使用頻率不高的字段

    為什么推薦多使用組合索引?

    為了節省mysql索引存儲空間以及提升搜索性能,能使用組合索引就不使用單列索引。

    使用組合索引需要遵循最左前綴原則,什么是最左前綴原則?

    前綴索引:where like a%通配符%在右邊不在左邊,什么是前綴索引呢?當索引是很長的字符序列時,這個索引會很慢,占用內存。如果以name為索引,當name對應的字符串很長時,就可以用前綴索引where like a%。從左到右都有索引,不能斷,直到遇到范圍查詢,。索引失效

    我們進行數據查詢很慢時,可能就會存在索引失效的情況。遇到這種情況不要怕,我們可以使用命令對語句的執行計劃進行分析。出來的信息有10列,分別是

    id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

    下面老劉就使用一個案例進行這些參數進行說明,大家可以跟著老劉一起練習。這10個參數老劉只講重要的,其他的大家自行學習。

    --用戶表create?table?tuser(id?int?primary?key,loginname?varchar(100),name?varchar(100),age?int,sex?char(1),dep?int,address?varchar(100));--部門表create?table?tdep(id?int?primary?key,name?varchar(100));--地址表create?table?taddr(id?int?primary?key,addr?varchar(100));--創建普通索引mysql>?alter?table?tuser?add?index?idx_dep(dep);--創建唯一索引mysql>?alter?table?tuser?add?unique?index?idx_loginname(loginname);--創建組合索引mysql>?alter?table?tuser?add?index?idx_name_age_sex(name,age,sex);--創建全文索引mysql>?alter?table?taddr?add?fulltext?ft_addr(addr);

    id

    每個語句都會自動分配的一個唯一標識符,表示查詢中操作表的順序,有四種情況:

    (重要)

    表示查詢類型,主要用于區別普通查詢、聯合查詢(union、union all)、子查詢等復雜查詢。

    ,表示不需要union操作或者不包含子查詢的簡單查詢。

    ,一個需要union操作或者含有子查詢的,位于最外層的單位查詢的即為,并且只有有一個 。

    先執行括號里面的sql語句,再執行外面的sql語句,內層的查詢就是。

    ,除了from字句中包含的子查詢外,其他地方出現的子查詢都可能是。

    ,表示這個的查詢要受到外部表查詢的影響。

    union,它連接的兩個查詢,第一個查詢是,除了第一個表外,第二個以后的表都是union。

    union,它與union一樣,出現在union 或union all語句中,但是這個查詢要受到外部查詢的影響。

    union ,它包含union的結果集,在union和union all語句中,因為它不需要參與查詢,所以id字段為null。

    ,from字句中出現的子查詢,也叫做派生表,其他數據庫中可能叫做內聯視圖或嵌套。

    可以理解為就是from字句后面出現子查詢,取個別名,叫派生表。

    table

    顯示查詢的表名,如果查詢使用了別名,那么這里顯示的是別名。

    type(重要)

    它會顯示很多參數類型,性能依次從好到壞顯示為這樣:

    system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL

    除了all之外,其他的type都可以使用到索引,除了之外,其他的type只可以用到一個索引,優化器會選用最優索引一個,最少要索引使用到range級別。 老劉只講這個重要的,有些內容也沒搞清楚。

    可遇不可求,表中只有一行數據或是空表。

    const(重要)

    使用唯一索引或主鍵,返回記錄一定是1行記錄的等值where條件。

    (重要)

    一般是連接字段主鍵或者唯一性索引。

    此類型通常出現在多表的 join 查詢,表示對于前表的每一個結果,都只能匹配到后表的一項結果。并且查詢的比較操作通常是 '=',查詢效率較高。

    ref(重要)

    針對非唯一性索引,使用等值(=)查詢非主鍵。或者是使用了最左前綴規則索引的查詢。

    range(重要)

    索引范圍掃描,常見于使用>,)判斷時,會導致索引失效而轉向全表掃描。主鍵索引字段上不可以判斷null,索引字段上使用 is null 判斷時,可使用索引。索引字段使用like以通配符開頭(‘%字符串’)時,會導致索引失效而轉向全表掃描。like要以通配符結束相當于范圍查找,索引不會失效。索引字段是字符串時,要加單引號,否則會導致索引失效而轉向全表掃描。索引字段不要使用or,否則會導致索引失效而轉向全表掃描。總結

    這篇內容大家一定要跟著老劉練習,光看不練等于白學!盡管當前水平可能不及各位大佬,但老劉會努力變得更加優秀,讓各位小伙伴自學從此不求人!

    如果有相關問題,聯系公眾號:程序員黑哥。文章都看到這了,點贊關注支持一波!

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有