衡陽百度網(wǎng)站建設(shè)西安快速排名優(yōu)化
mysql索引
InnoDB 索引存儲(chǔ)
主鍵索引(聚簇索引)
- 定義:主鍵索引是 InnoDB 存儲(chǔ)引擎的聚簇索引,它決定了表中數(shù)據(jù)的物理存儲(chǔ)順序。每個(gè) InnoDB 表都有一個(gè)且僅有一個(gè)聚簇索引。
- 存儲(chǔ):主鍵索引的葉子節(jié)點(diǎn)直接包含表的數(shù)據(jù)行。這意味著數(shù)據(jù)行按照主鍵索引的順序物理存儲(chǔ)在磁盤上。
- 特點(diǎn):
- 數(shù)據(jù)和索引緊密關(guān)聯(lián):數(shù)據(jù)行和索引項(xiàng)緊密關(guān)聯(lián),優(yōu)化了基于主鍵的查詢。
- 唯一性:主鍵必須是唯一的,且不能為 NULL。
二級(jí)索引(輔助索引)
- 定義:二級(jí)索引是用于快速查找非主鍵列的索引。它們不是聚簇索引,因此葉子節(jié)點(diǎn)不包含完整的數(shù)據(jù)行。
- 存儲(chǔ):二級(jí)索引的葉子節(jié)點(diǎn)包含索引列的值和對(duì)應(yīng)行的主鍵值。這允許數(shù)據(jù)庫通過二級(jí)索引快速找到主鍵,然后使用主鍵在聚簇索引中找到完整數(shù)據(jù)行。
- 特點(diǎn):
- 支持多列索引:二級(jí)索引可以包含多個(gè)列。
- 查詢優(yōu)化:通過二級(jí)索引可以優(yōu)化非主鍵列的查詢。
- 回表操作:當(dāng)需要訪問非主鍵列的完整數(shù)據(jù)時(shí),需要執(zhí)行回表操作,即使用二級(jí)索引中的主鍵值在聚簇索引中查找數(shù)據(jù)行。
覆蓋索引
-
定義:覆蓋索引是一個(gè)索引包含了查詢中所需的全部列,因此查詢可以直接從索引中獲取數(shù)據(jù),而不需要訪問實(shí)際的數(shù)據(jù)行。
注意這里一定是一個(gè)索引,
如果查詢中所需的三個(gè)列,它們各自都有索引,這個(gè)查詢也不算覆蓋索引查詢。
因?yàn)閿?shù)據(jù)庫在執(zhí)行查詢時(shí),不能僅通過一個(gè)索引來獲取
A
、B
和C
的值。數(shù)據(jù)庫可能需要使用索引idx_A
來定位行,然后訪問表來獲取B
和C
的值而如果是一個(gè)索引中包含了查詢中所需的全部列的話:就不需要再去查詢其他表了,因?yàn)榇藭r(shí)索引中就已經(jīng)有了全部所需信息。
使用覆蓋索引是也要注意 “最左前綴原則”。
如果所需的全部列是A,C,但是有一個(gè)復(fù)合索引A,B,C,此時(shí)也不需要多余的回表查詢,因?yàn)樗饕及钄?shù)據(jù)。
-
優(yōu)點(diǎn):
- 減少磁盤I/O:避免了對(duì)數(shù)據(jù)行的訪問,減少了磁盤I/O操作。
- 提高查詢性能:查詢速度顯著提高,因?yàn)椴恍枰乇聿僮鳌?/li>
- 創(chuàng)建:通過創(chuàng)建復(fù)合索引(也不一定是復(fù)合索引,一般是復(fù)合索引,可以確保索引覆蓋查詢中的所有列)。
- 覆蓋索引原理:
MyISAM 索引
- 定義:MyISAM 是 MySQL 的另一個(gè)存儲(chǔ)引擎,它使用非聚簇索引。
- 存儲(chǔ):MyISAM 的索引和數(shù)據(jù)是分開存儲(chǔ)的。索引的葉子節(jié)點(diǎn)包含指向數(shù)據(jù)行的指針,而不是數(shù)據(jù)行本身。
- 特點(diǎn):
- 性能優(yōu)化:MyISAM 支持壓縮索引,這可以減少索引文件的大小,提高磁盤空間的利用率。
- 全文索引:MyISAM 支持全文索引,這在處理大量文本數(shù)據(jù)時(shí)非常有用。
- 寫操作效率:由于數(shù)據(jù)和索引分離,MyISAM 在寫操作上通常比 InnoDB 更快。
總結(jié)來說,InnoDB 和 MyISAM 在索引的存儲(chǔ)方式和內(nèi)部操作上存在顯著差異。InnoDB 的聚簇索引和二級(jí)索引設(shè)計(jì)使其更適合事務(wù)處理和多用戶并發(fā)訪問,而 MyISAM 的非聚簇索引和全文索引支持使其在特定的讀密集型應(yīng)用中表現(xiàn)更佳。覆蓋索引是優(yōu)化查詢性能的重要手段,通過創(chuàng)建合適的索引,可以顯著提高數(shù)據(jù)庫的查詢效率。
若有錯(cuò)誤與不足請(qǐng)指出,關(guān)注DPT一起進(jìn)步吧!!!