宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

MySQL 索引分析

管理 管理 編輯 刪除

索引的概述

8e69920240517110049419.png

索引是一種用于快速查詢和檢索數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),其本質(zhì)可以看成是一種排序好的數(shù)據(jù)結(jié)構(gòu)。索引的作用就相當(dāng)于書的目錄。打個比方: 我們在查字典的時候,如果沒有目錄,那我們就只能一頁一頁的去找我們需要查的那個字,速度很慢。如果有目錄了,我們只需要先去目錄里查找字的位置,然后直接翻到那一頁就行了。索引底層數(shù)據(jù)結(jié)構(gòu)存在很多種類型,常見的索引結(jié)構(gòu)有: B 樹, B+樹 和 Hash、紅黑樹。在 MySQL 中,無論是 Innodb 還是 MyIsam,都使用了 B+樹作為索引結(jié)構(gòu)。

2、索引原理

索引的存儲原理大致可以概括為一句話:以空間換時間。

一般來說索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往是存儲在磁盤上的文件中的(可能存儲在單獨的索引文件中,也可能和數(shù)據(jù)一起存儲在數(shù)據(jù)文件中)。數(shù)據(jù)庫在未添加索引進(jìn)行查詢的時候默認(rèn)是進(jìn)行全文搜索,也就是說有多少數(shù)據(jù)就進(jìn)行多少次查詢,然后找到相應(yīng)的數(shù)據(jù)就把它們放到結(jié)果集中,直到全文掃描完畢。

3、索引的優(yōu)缺點

優(yōu)點:
大大提高數(shù)據(jù)查詢速度。
可以提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的IO成本,類似于書的目錄。
通過索引列對數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)的排序成本降低了CPU的消耗。
被索引的列會自動進(jìn)行排序,包括【單例索引】和【組合索引】,只是組合索引的排序需要復(fù)雜一些。
如果按照索引列的順序進(jìn)行排序,對order by語句來說,效率就會提高很多。

缺點:
索引會占據(jù)磁盤空間。
索引雖然會提高查詢效率,但是會降低更新表的效率。比如每次對表進(jìn)行增刪改查操作,MySQL不僅要保存數(shù)據(jù),還有保存或者更新對應(yīng)的索引文件。
維護(hù)索引需要消耗數(shù)據(jù)庫資源。

注意:但是,使用索引一定能提高查詢性能嗎?  大多數(shù)情況下,索引查詢都是比全表掃描要快的。但是如果數(shù)據(jù)庫的數(shù)據(jù)量不大,
那么使用索引也不一定能夠帶來很大提升。

4、索引的數(shù)據(jù)結(jié)構(gòu)

MySQL 默認(rèn)的存儲引擎 InnoDB 采用的是 B+ 作為索引的數(shù)據(jù)結(jié)構(gòu),原因有:

B+ 樹的非葉子節(jié)點不存放實際的記錄數(shù)據(jù),僅存放索引,因此數(shù)據(jù)量相同的情況下,相比存儲即存索引又存記錄的 B 樹,B+樹的非葉子節(jié)點可以存放更多的索引,因此 B+ 樹可以比 B 樹更「矮胖」,查詢底層節(jié)點的磁盤 I/O次數(shù)會更少。
B+ 樹有大量的冗余節(jié)點(所有非葉子節(jié)點都是冗余索引),這些冗余索引讓 B+ 樹在插入、刪除的效率都更高,比如刪除根節(jié)點的時候,不會像 B 樹那樣會發(fā)生復(fù)雜的樹的變化;
B+ 樹葉子節(jié)點之間用鏈表連接了起來,有利于范圍查詢,而 B 樹要實現(xiàn)范圍查詢,因此只能通過樹的遍歷來完成范圍查詢,這會涉及多個節(jié)點的磁盤 I/O 操作,范圍查詢效率不如 B+ 樹。

5、索引的分類

(1)我們可以按照四個角度來分類索引。
   按「數(shù)據(jù)結(jié)構(gòu)」分類:B+tree索引、Hash索引、Full-text索引。
   按「物理存儲」分類:聚簇索引(主鍵索引)、二級索引(輔助索引)。
   按「字段特性」分類:主鍵索引、唯一索引、普通索引、前綴索引。
   按「字段個數(shù)」分類:單列索引、聯(lián)合索引。
   InnoDB 是在 MySQL 5.5 之后成為默認(rèn)的 MySQL 存儲引擎,B+Tree 索引類型也是 MySQL 存儲引擎采用最多的索引類型。

   在創(chuàng)建表時,InnoDB 存儲引擎會根據(jù)不同的場景選擇不同的列作為索引:
   如果有主鍵,默認(rèn)會使用主鍵作為聚簇索引的索引鍵(key);
   如果沒有主鍵,就選擇第一個不包含 NULL 值的唯一列作為聚簇索引的索引鍵(key);
   在上面兩個都沒有的情況下,InnoDB 將自動生成一個隱式自增 id 列作為聚簇索引的索引鍵(key);
   其它索引都屬于輔助索引(Secondary Index),也被稱為二級索引或非聚簇索引。創(chuàng)建的主鍵索引和二級索引默認(rèn)使用的是 B+Tree 索引。
   從物理存儲的角度來看,索引分為聚簇索引(主鍵索引)、二級索引(輔助索引)。
   區(qū)別:
   主鍵索引的 B+Tree 的葉子節(jié)點存放的是實際數(shù)據(jù),所有完整的用戶記錄都存放在主鍵索引的 B+Tree 的葉子節(jié)點里;
   二級索引的 B+Tree 的葉子節(jié)點存放的是主鍵值,而不是實際數(shù)據(jù)。
   所以,在查詢時使用了二級索引,如果查詢的數(shù)據(jù)能在二級索引里查詢的到,那么就不需要回表,這個過程就是覆蓋索引。
   如果查詢的數(shù)據(jù)不在二級索引里,就會先檢索二級索引,找到對應(yīng)的葉子節(jié)點,獲取到主鍵值后,然后再檢索主鍵索引,
   就能查詢到數(shù)據(jù)了,這個過程就是回表。
   
(2)常見索引的介紹
   1.主鍵索引:primary key
   設(shè)定為主鍵后,數(shù)據(jù)庫自動建立索引,InnoDB為聚簇索引,主鍵索引列值不能為空(Null)。
   2.唯一索引:
   索引列的值必須唯一,但允許有空值(Null),但只允許有一個空值(Null)。
   3.復(fù)合索引:
   一個索引可以包含多個列,多個列共同構(gòu)成一個復(fù)合索引。
   4.全文索引:
   Full Text(MySQL5.7之前,只有MYISAM存儲引擎引擎支持全文索引)。
   全文索引類型為FULLTEXT,在定義索引的列上支持值的全文查找允許在這些索引列中插入重復(fù)值和空值。全文索引可以在Char、VarChar 上創(chuàng)建。
   5.空間索引:
   MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIS幾何數(shù)據(jù)模型,MySQL在空間索引這方年遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則。
   6.前綴索引:
   在文本類型為char、varchar、text類列上創(chuàng)建索引時,可以指定索引列的長度,但是數(shù)值類型不能指定。

6、如何判斷sql是否走索引?

通過explain關(guān)鍵字查看這條語句的執(zhí)行計劃
key:實際使用的索引,如果為NULL,則表示沒有使用索引
type:顯示查詢使用了何種類型,從好到壞,依次為:
system:表中只有一行數(shù)據(jù)
const:單表中最多只有一條匹配行,比如說根據(jù)主鍵或者說唯一索引進(jìn)行查詢
eq-ref:使用唯一索引,比如說在聯(lián)表查詢中使用主鍵或者唯一索引作為關(guān)聯(lián)條件
ref:使用非唯一索引或者唯一索引前綴掃描
range:索引范圍掃描
index:全索引掃描
all:全表掃描
possible_key:能使用那個索引在表中找到該行
rows:大致估算出找到所需的記錄所需要讀取的行數(shù)

7、索引失效以及為什么失效

當(dāng)我們使用左或者左右模糊匹配的時候,也就是 like %xx 或者 like %xx%這兩種方式都會造成索引失效;因為索引是通過前綴進(jìn)行構(gòu)建的。
當(dāng)我們在查詢條件中對索引列使用函數(shù),就會導(dǎo)致索引失效。因為MySQL沒有對使用了函數(shù)后的索引列創(chuàng)建索引。
當(dāng)我們在查詢條件中對索引列進(jìn)行表達(dá)式計算,也是無法走索引的。同上。
MySQL 在遇到字符串和數(shù)字比較的時候,會自動把字符串轉(zhuǎn)為數(shù)字,然后再進(jìn)行比較。如果字符串是索引列,而條件語句中的輸入?yún)?shù)是數(shù)字的話,
那么索引列會發(fā)生隱式類型轉(zhuǎn)換,由于隱式類型轉(zhuǎn)換是通過 CAST 函數(shù)實現(xiàn)的,等同于對索引列使用了函數(shù),所以就會導(dǎo)致索引失效。
聯(lián)合索引要能正確使用需要遵循最左匹配原則,也就是按照最左優(yōu)先的方式進(jìn)行索引的匹配,否則就會導(dǎo)致索引失效。
在 WHERE 子句中,如果在 OR 前的條件列是索引列,而在 OR 后的條件列不是索引列,那么索引會失效。

8、索引為什么能提高查詢性能

MySQL 的數(shù)據(jù)是持久化的,意味著數(shù)據(jù)(索引+記錄)是保存到磁盤上的,因為這樣即使設(shè)備斷電了,數(shù)據(jù)也不會丟失。
數(shù)據(jù)存儲在磁盤( SSD 跟 CPU 性能也不在一個量級),而磁盤處理數(shù)據(jù)很慢;提高磁盤性能主要通過減少 I/O 次數(shù),以及單次 I/O 有效數(shù)據(jù)量;

索引通過多階(一個節(jié)點保存多個數(shù)據(jù),指向多個子節(jié)點)使樹的結(jié)構(gòu)更矮胖,從而減少 I/O 次數(shù);
索引通過 B+ 樹,把業(yè)務(wù)數(shù)據(jù)與索引數(shù)據(jù)分離,來提高單次 I/O 有效數(shù)據(jù)量,從而減少 I/O 次數(shù);
索引通過樹數(shù)據(jù)的有序和「二分查找」(多階樹可以假設(shè)為多分查找),大大縮小查詢范圍;
索引針對的是單個字段或部分字段,數(shù)據(jù)量本身比一條記錄的數(shù)據(jù)量要少的多,這樣即使通過掃描的方式查詢索引也比掃描數(shù)據(jù)庫表本身快的多

請登錄后查看

小碼二開 最后編輯于2024-05-17 11:00:58

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
946
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準(zhǔn)確時需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊

切換手機(jī)號登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服