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

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

MySQL 索引分析

管理 管理 編輯 刪除

索引的概述

8e69920240517110049419.png

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

2、索引原理

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

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

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

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

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

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

4、索引的數據結構

MySQL 默認的存儲引擎 InnoDB 采用的是 B+ 作為索引的數據結構,原因有:

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

5、索引的分類

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

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

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

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

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

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

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

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

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

請登錄后查看

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

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

{{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 ? '取消回復' : '回復'}}
刪除
回復
回復

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

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

相關推薦

快速安全登錄

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

微信登錄/注冊

切換手機號登錄

{{ bind_phone ? '綁定手機' : '手機登錄'}}

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

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

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