新聞中心
在現代軟件開發(fā)中,數據庫是不可或缺的一部分,而索引作為數據庫中的重要組成部分,可大幅提高查詢效率。然而,對于數據庫索引的理解程度卻是各不相同的。在本文中,我們將深入探討數據庫索引的相關知識,并通過一些實際例子來解析數據庫索引的工作原理。

“專業(yè)、務實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯是您可以信賴的網站建設服務商、專業(yè)的互聯網服務提供商! 專注于成都網站制作、成都網站建設、外貿營銷網站建設、軟件開發(fā)、設計服務業(yè)務。我們始終堅持以客戶需求為導向,結合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯建站將不斷地超越自我,追逐市場,引領市場!
數據庫索引是什么?
在深入了解數據庫索引之前,我們需要先明確一下數據庫索引的概念。簡單來說,數據庫索引就是為了提高查詢效率而創(chuàng)建的一種數據結構,它將某些列的數據進行預處理,以便更快地在該列上執(zhí)行查詢操作。
比如,我們在一張存儲著大量用戶信息的數據表中,需要查詢名字為“張三”的用戶信息。如果沒有索引的話,系統(tǒng)會逐一檢查每一條記錄,直到找到對應的記錄為止。而如果在該表的“姓名”列創(chuàng)建了索引,系統(tǒng)就可以直接跳轉到“姓名”索引中的“張三”記錄上,從而大幅提高查詢效率。
數據庫索引的類型
常見的數據庫索引類型包括了B-Tree索引、Hash索引和Full-text索引等。在這里我們就來簡單介紹一下幾種索引:
1. B-Tree 索引
B-Tree 索引是一種樹型索引結構,它可以在 O(logN) 的時間復雜度內定位到指定的記錄。它的創(chuàng)建方式是將數據表的某一列經過排序后構建成一棵平衡的 B-Tree 樹。每個節(jié)點均有指向當前節(jié)點數據下限和上限之間的子節(jié)點的指針。當查詢時,系統(tǒng)將從根節(jié)點開始進行查找,逐漸向下查找子節(jié)點,直到找到符合條件的記錄。
2. Hash 索引
Hash 索引是使用哈希表進行建立的一種索引,它可以在 O(1) 的時間復雜度內定位到指定記錄。當建立 Hash 索引時,會使用哈希函數將數據表的某一列經過轉換后存儲到哈希表中,并記錄其在數據表中實際存儲位置。當查詢時,系統(tǒng)將使用同樣的哈希函數將查詢條件轉換成哈希值,并在哈希表中查找對應記錄的存儲位置。
3. Full-text 索引
Full-text 索引是一種文本索引,它可以提高對文本類數據進行搜索的效率。當建立 Full-text 索引時,會對數據表中的文本列中的單詞進行分詞,并將每個單詞進行排序和紀錄位置,以便更快地執(zhí)行全文檢索操作。當查詢時,系統(tǒng)將搜索關鍵詞進行分詞,并按照全文索引的方式在數據表的對應列中進行查找。
數據庫索引優(yōu)化的實例
現在我們來看一些實際例子,看一下如何通過優(yōu)化數據庫索引來提高查詢效率。
1.創(chuàng)建多列索引
在我們的用戶信息數據表中,我們需要查詢的往往不止是一個條件,可能需要同時查詢用戶是否在某地區(qū),或者同時查詢用戶的性別、年齡等信息。
下面是一個針對“地區(qū)+性別”這兩列的多列索引創(chuàng)建實例:
`CREATE INDEX region_sex_idx ON user_info(region, sex)`
在創(chuàng)建了上述多列索引后,我們即可在同時查詢“地區(qū)+性別”這兩個條件時,實現更快速的索引查找。
2.在較長文本列上建立Full-text 索引
對于某些存儲比較長的文本列,如用戶的備注信息等,我們同樣可以通過全文檢索來提高查詢效率,而這就需要建立對應列的Full-text索引。
下面是一個對“remarks”列創(chuàng)建Full-text索引的實例:
`CREATE FULLTEXT INDEX remarks_ft_idx ON user_info(remarks)`
在創(chuàng)建了上述Full-text索引后,我們即可在基于“remarks”列的全文檢索時,實現更精準的數據查詢。
3.考慮走索引的優(yōu)化
雖然索引可以幫助我們大幅提高查詢效率,但如果不考慮好走索引的問題,同樣會降低效率,甚至還可能引發(fā)一些潛在的問題。
下面是一個基于用戶表user_info的例子。在這個例子里,我們需要查詢出所有未婚女性用戶的信息。下面的SQL語句便是一種錯誤的查詢方式:
`SELECT * FROM user_info WHERE sex=‘女’ AND marital_status=‘未婚’`
在上述查詢語句中,并沒有對marital_status列的索引進行優(yōu)化,從而導致系統(tǒng)還需要逐條檢查所有記錄,從而耗費大量時間。
正確的查詢方式應該是:
`SELECT * FROM user_info WHERE marital_status=‘未婚’ AND sex=‘女’`
在這種方式下,系統(tǒng)將首先使用marital_status列上的索引來篩選出所有“未婚”用戶,然后再使用sex列的索引進一步篩選出所有“女性”用戶,最終得到符合條件的記錄。
結論
通過本文的介紹,相信大家已經掌握了一些關于數據庫索引的相關知識和優(yōu)化技巧。在實際的工作開發(fā)中,我們需要根據自身的業(yè)務需求和數據庫性能瓶頸做出科學的索引優(yōu)化決策,從而實現更高效的數據庫操作,讓我們的業(yè)務更具可擴展性和可靠性。
成都網站建設公司-創(chuàng)新互聯為您提供網站建設、網站制作、網頁設計及定制高端網站建設服務!
mysql數據庫怎么建索引?
好難
MySQL數據庫建立索引步驟:
1、使用SQLPlus或者PLSQL登錄MySQL數據庫陪渣毀。
2、執(zhí)行語句create index indexname on table(col) tablespace tablespacename;其中
“indexname”為需要建立索引的索引蘆備名;
“table”是需要建立索引的表;
“col”為需梁殲要建立索引的字段列;
”tablespacename“為建立索引存放的空間(如果不需要制定表空間則使用“create index indexname on table(col)”)。
表名右擊,菜單里面就有索引,然后選擇要索引的字段。確定就可以了
create index 索引名稱 on 表
(
字段
);
MySql索引之哪些情況適合創(chuàng)建索引
說明:不要以為唯一索引影響了 insert 速度,這個速度損耗可以忽略,但提高查找速度是明顯的。
某個字段在SELECT語句的 WHERE 條件中經常被使用到,那么就需要給這個字段創(chuàng)建索引了。尤其是在
數據量大的情況下,創(chuàng)建普通索引就可以大幅提升數據查詢的效率。
比如student_info數據表(含100萬條數據),假設我們想要查詢 student_id=的用戶信息。
索引就是讓數據按照某種順序進行存儲或檢索,因此當我們使用 GROUP BY 對數據進行分組查詢,或者
使用 ORDER BY 對數據進行排序的時候,就需要 對分組或者排序的字段進行索引 。如果待排序的列有多
個,那么可以在這些列上建立 組合索引 。
對數據按照某個條件進行查詢后再進行 UPDATE 或 DELETE 的操作,如果對 WHERE 字段創(chuàng)建了索引,就
能大幅提升效率。原理是因為我們需要先根據 WHERE 條首慧件列檢索出來這條記錄,然后再對它進行更新或
刪除。如果進行更新的時候,更新的字段是非索引字段頌譽,提升的效率會更明顯,這是因為非索引字段更
新不需要對索引進行維護。
有時候我們需要對某個字段進行去重,使用 DISTINCT,那么對這個字段創(chuàng)建索引,也會提升查詢效率。
比如,我們想要查詢課程表中不同的 student_id 都有哪些,如果我們沒有對 student_id 創(chuàng)建索引,執(zhí)行
SQL 語句:
運行結果(條記錄,運行時間 0.683s ):
如果我們對 student_id 創(chuàng)建索引,再執(zhí)者櫻答行 SQL 語句:
運行結果(條記錄,運行時間 0.010s ):
你能看到 SQL 查詢效率有了提升,同時顯示出來的 student_id 還是按照 遞增的順序 進行展示的。這是因
為索引會對數據按照某種順序進行排序,所以在去重的時候也會快很多。
首先, 連接表的數量盡量不要超過 3 張 ,因為每增加一張表就相當于增加了一次嵌套的循環(huán),數量級增
長會非??欤瑖乐赜绊懖樵兊男?。
其次, 對 WHERE 條件創(chuàng)建索引 ,因為 WHERE 才是對數據條件的過濾。如果在數據量非常大的情況下,
沒有 WHERE 條件過濾是非常可怕的。
最后, 對用于連接的字段創(chuàng)建索引 ,并且該字段在多張表中的 類型必須一致 。比如 course_id 在
student_info 表和 course 表中都為 int(11) 類型,而不能一個為 int 另一個為 varchar 類型。
舉個例子,如果我們只對 student_id 創(chuàng)建索引,執(zhí)行 SQL 語句:
運行結果(1 條數據,運行時間 0.189s ):
這里我們對 name 創(chuàng)建索引,再執(zhí)行上面的 SQL 語句,運行時間為 0.002s 。
創(chuàng)建一張商戶表,因為地址字段比較長,在地址字段上建立前綴索引
問題是,截取多少呢?截取得多了,達不到節(jié)省索引存儲空間的目的;截取得少了,重復內容太多,字
段的散列度(選擇性)會降低。
怎么計算不同的長度的選擇性呢?
先看一下字段在全部數據中的選擇度:
通過不同長度去計算,與全表的選擇性對比:
公式:
例如:
引申另一個問題:索引列前綴對排序的影響
拓展:Alibaba《Java開發(fā)手冊》
【 強制 】在 varchar 字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據實際文本
區(qū)分度決定索引長度。
說明:索引的長度與區(qū)分度是一對矛盾體,一般對字符串類型數據,長度為 20 的索引,區(qū)分度會 高達
90% 以上 ,可以使用 count(distinct left(列名, 索引長度))/count(*)的區(qū)分度來確定。
這樣也可以較少的建立一些索引。同時,由于”最左前綴原則”,可以增加聯合索引的使用率。
結論:在數據表中的數據行數比較少的情況下,比如不到 1000 行,是不需要創(chuàng)建索引的。
舉例1:要在 100 萬行數據中查找其中的 50 萬行(比如性別為男的數據),一旦創(chuàng)建了索引,你需要先
訪問 50 萬次索引,然后再訪問 50 萬次數據表,這樣加起來的開銷比不使用索引可能還要大。
舉例2:假設有一個學生表,學生總數為 100 萬人,男性只有 10 個人,也就是占總人口的 10 萬分之 1。
學生表 student_gender 結構如下。其中數據表中的 student_gender 字段取值為 0 或 1,0 代表女性,1 代
表男性。
如果我們要篩選出這個學生表中的男性,可以使用:
運行結果(10 條數據,運行時間 0.696s ):
結論:當數據重復度大,比如 高于 10% 的時候,也不需要對這個字段使用索引。
例如身份證、UUID(在索引比較時需要轉為ASCII,并且插入時可能造成頁分裂)、MD5、HASH、無序長字
符串等。
① 冗余索引
舉例:建表語句如下
我們知道,通過 idx_name_birthday_phone_number 索引就可以對 name 列進行快速搜索,再創(chuàng)建一
個專門針對 name 列的索引就算是一個 冗余索引 ,維護這個索引只會增加維護的成本,并不會對搜索有
什么好處。
② 重復索引
另一種情況,我們可能會對某個列 重復建立索引 ,比方說這樣:
我們看到,col1 既是主鍵、又給它定義為一個唯一索引,還給它定義了一個普通索引,可是主鍵本身就
會生成聚簇索引,所以定義的唯一索引和普通索引是重復的,這種情況要避免。
歡迎共同進步:
QQ群:
關于數據庫索引的例子的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
創(chuàng)新互聯-老牌IDC、云計算及IT信息化服務領域的服務供應商,業(yè)務涵蓋IDC(互聯網數據中心)服務、云計算服務、IT信息化、AI算力租賃平臺(智算云),軟件開發(fā),網站建設,咨詢熱線:028-86922220
本文題目:深入理解數據庫索引:實際例子解析(數據庫索引的例子)
文章地址:http://m.fisionsoft.com.cn/article/cdppdep.html


咨詢
建站咨詢
