撩课mysql_撩课-Mysql第20部分索引
什么是索引
索引用于快速找出
在某個列中有一特定值的行,
不使用索引,
MySQL必須從第一條記錄開始
讀完整個表,
直到找出相關(guān)的行,
表越大,
查詢數(shù)據(jù)所花費的時間就越多,
如果表中查詢的列有一個索引,
MySQL能夠快速到達一個位置
去搜索數(shù)據(jù)文件,
而不必查看所有數(shù)據(jù),
那么將會節(jié)省很大一部分時間
索引的優(yōu)勢與劣勢
優(yōu)勢
類似大學(xué)圖書館建書目索引,
提高數(shù)據(jù)檢索效率,
降低數(shù)據(jù)庫的IO成本。
通過索引對數(shù)據(jù)進行排序,
降低數(shù)據(jù)排序的成本,降低了CPU的消耗。
劣勢
實際上索引也是一張表,
該表保存了主鍵與索引字段,
并指向?qū)嶓w表的記錄,
所以索引列也是要占空間的。
雖然索引大大提高了查詢速度,
同時確會降低更新表的速度,
如對表進行INSERT、UPDATE、DELETE。
索引的分類
單值索引
即一個索引只包含單個列,
一個表可以有多個單列索引。
唯一索引
索引列的值必須唯一,
但允許有空值。
復(fù)合索引
一個索引包含多個列。
INDEX MultiIdx(id,name,age)
全文索引
只有在MyISAM引擎上才能使用,
只能在CHAR,VARCHAR,
TEXT類型字段上使用全文索引
索引操作
創(chuàng)建索引
CREATE INDEX 索引名稱 ON table (column[, column]...);
create INDEX salary_index ON emp(salary)
刪除索引
DROP INDEX 索引名稱 ON 表名
查看索引
show index from 表名;
Table
表名
Non_unique
如果索引不能包括重復(fù)詞,則為0。如果可以,則為1。
Key_name
索引的名稱
Seq_in_index
索引中的列序列號,從1開始。
Column_name
列名稱。
Collation
列以什么方式存儲在索引中。
在MySQL中,有值‘A'(升序)或NULL(無分類)。
Cardinality
索引中唯一值的數(shù)目的估計值。
過運行ANALYZE TABLE或myisamchk -a可以更新。
基數(shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)來計數(shù),
所以即使對于小型表,
該值也沒有必要是精確的。
基數(shù)越大,當(dāng)進行聯(lián)合時,
MySQL使用該索引的機會就越大。
Sub_part
如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
Packed
指示關(guān)鍵字如何被壓縮。
如果沒有被壓縮,則為NULL。
Null
如果列含有NULL,則含有YES。如果沒有,則該列含有NO。
Index_type
用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment
索引備注信息
自動創(chuàng)建索引
在表上定義了主鍵時,
會自動創(chuàng)建一個對應(yīng)的唯一索引
在表上定義了一個外鍵時,
會自動創(chuàng)建一個普通索引
**EXPLAIN **
用來查看索引是否正在被使用,并且輸出其使用的索引的信息。
id:
SELECT識別符。
這是SELECT的查詢序列號,也就是一條語句中,
該select是第幾次出現(xiàn)。
在次語句中,
select就只有一個,所以是1.
select_type:
所使用的SELECT查詢類型,
SIMPLE表示為簡單的SELECT,
不實用UNION或子查詢,
就為簡單的SELECT。
table:
數(shù)據(jù)表的名字。
他們按被讀取的先后順序排列
type:
指定本數(shù)據(jù)表和其他數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系,
該表中所有符合檢索值的記錄都會被取出來和
從上一個表中取出來的記錄作聯(lián)合。
key:
實際選用的索引
possible_keys:
MySQL在搜索數(shù)據(jù)記錄時可以選用的各個索引,
該表中就只有一個索引,year_publication
key_len:
顯示了mysql使用索引的長度(也就是使用的索引個數(shù)),
當(dāng) key 字段的值為 null時,索引的長度就是 null。
注意,key_len的值可以告訴你
在聯(lián)合索引中mysql會真正
使用了哪些索引。
這里就使用了1個索引,所以為1,
ref:
給出關(guān)聯(lián)關(guān)系中另一個數(shù)據(jù)表中數(shù)據(jù)列的名字。
常量(const),這里使用的是1990,就是常量。
rows:
MySQL在執(zhí)行這個查詢時
預(yù)計會從這個數(shù)據(jù)表里讀出的數(shù)據(jù)行的個數(shù)。
extra:
提供了與關(guān)聯(lián)操作有關(guān)的信息,
沒有則什么都不寫。
索引結(jié)構(gòu)
先會對數(shù)據(jù)進行排序
btree索引
B+樹索引
B+樹是一個平衡的多叉樹,
從根節(jié)點到每個葉子節(jié)點的高度差值不超過1
而且同層級的節(jié)點間有指針相互鏈接。
hash索引
哈希索引就是采用一定的哈希算法,
把鍵值換算成新的哈希值,
檢索時不需要類似B+樹那樣從根節(jié)點到葉子節(jié)點逐級查找,
只需一次哈希算法即可立刻定位到相應(yīng)的位置,速度非常快。
hash 索引結(jié)構(gòu)的特殊性,
其檢索效率非常高,
索引的檢索可以一次定位,
不像B-Tree 索引需要從根節(jié)點到枝節(jié)點,
最后才能訪問到頁節(jié)點這樣多次的IO訪問,
所以 Hash 索引的查詢效率要遠高于 B-Tree 索引。
哪些情況需要創(chuàng)建索引
主鍵自動建立唯一索引
頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
查詢中與其他表關(guān)聯(lián)的字段,
外鍵關(guān)系建立索引
頻繁更新的字段不適合建立索引,
因為每次更新不單單是
更新了記錄還會更新索引
WHERE條件里用不到的字段不創(chuàng)建索引
查詢中排序的字段,
排序的字段若通過索引
去訪問將大大提高排序速度
查詢中統(tǒng)計或者分組字段
哪些情況不需要創(chuàng)建索引
表記錄太少
經(jīng)常增刪改的表
如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi)容
為它建立索引就沒有太大的實際效果
如果你想要獲取Xmind思維導(dǎo)圖源件加群:869866610,進群可以獲取以上技術(shù)的學(xué)習(xí)視頻。
總結(jié)
以上是生活随笔為你收集整理的撩课mysql_撩课-Mysql第20部分索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node mysql 模块化_Node.
- 下一篇: 长沙岳麓区阳光100的电是多少钱一度?