索引的原理:
沒有索引為什么會慢物邑?因?yàn)椴閿?shù)據(jù)時數(shù)據(jù)庫會進(jìn)行全表掃描拂封。
使用索引為什么會快?因?yàn)閿?shù)據(jù)庫會形成一個索引的數(shù)據(jù)結(jié)構(gòu)萧恕,比如二叉樹
索引的代價:
1屹徘、磁盤占用
2簿煌、如果對表進(jìn)行修改豆励,刪除技扼,添加淮摔,會對索引進(jìn)行維護(hù)造垛,對速度有影響骚烧。
索引的類型
1赖草、主鍵索引鳞疲,主鍵自動的為主索引(類型Primary)
2尚洽、唯一索引(UNIQUE)
3挣柬、普通索引(INDEX)
4邪蛔、全文索引(FULLTEXT)[適用于MyISAM]
開發(fā)中考慮使用:全文搜索Solr和ElasticSearch
索引使用
1、添加唯一索引
create UNIQUE index 索引名稱 on 表名 (列名)
2、添加普通索引
方式一:create index 索引名稱 on 表名 (列名)
方式二:alter table 表名 add index 索引名稱 (列名)
3、添加主鍵索引
方式一:alter table 表名 add primary key (列名)
方式二:create table 表名(
id int primary key -- 建表時指定
)
4、查詢表是否有索引
方式一:show indexes from 表名
方式二:show index from 表名
方式三:show keys from 表名
方式四:desc 表名(不推薦使用,顯示的信息不夠詳細(xì))
5、刪除索引
drop index 索引名稱 on 表名
6、刪除主鍵索引
alter table 表名 drop primary key
7豁生、修改索引
先刪除索引,然后添加新的索引。
創(chuàng)建索引規(guī)則
1树碱、較頻繁的作為查詢條件字段應(yīng)該創(chuàng)建索引
2框舔、唯一性太差的字段不適合單獨(dú)創(chuàng)建索引纬凤,即使頻繁作為查詢條件
3停士、更新非常頻繁的字段不適合創(chuàng)建索引
4逻族、不會出現(xiàn)在WHERE子句中字段不應(yīng)該創(chuàng)建索引
練習(xí)
1、創(chuàng)建一張訂單表order(id號,商品名,訂購人舅踪,數(shù)量)货徙,要求id為主鍵屡贺,使用2種方式創(chuàng)建主鍵。
2、創(chuàng)建一張?zhí)貎r菜譜表menu(id號,菜譜名,廚師怠李,點(diǎn)餐人身份證,價格),要求id號為主鍵箱歧,點(diǎn)餐人身份證是unique价淌,使用兩種方式創(chuàng)建unique病毡。
3、創(chuàng)建一張運(yùn)動員表sportman(id號,名字,特長),要求id號為主鍵,名字為普通索引,使用2種方式創(chuàng)建索引。
什么情況下使用索引脸候?
一般項(xiàng)目中,select大約占90%,而update,delete,insert占10%,所以使用索引能夠優(yōu)化服務(wù)器對數(shù)據(jù)庫的訪問。
如何選擇對某一列使用普通索引還是唯一索引?
如果某列的值是不會重復(fù)的幸斥,優(yōu)先考慮使用unique索引甲葬,否則使用普通索引经窖。
面試題
- mysql 索引是怎么實(shí)現(xiàn)的
索引是滿足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu)宪卿,而這些數(shù)據(jù)結(jié)構(gòu)會以某種方式指向數(shù)據(jù)佑钾,從而實(shí)現(xiàn)高效查找數(shù)據(jù)休溶。
具體來說 MySQL 中的索引徒役,不同的數(shù)據(jù)引擎實(shí)現(xiàn)有所不同瞻讽,但目前主流的數(shù)據(jù)庫引擎的索引都是 B+ 樹實(shí)現(xiàn)的,B+ 樹的搜索效率,可以到達(dá)二分法的性能磅轻,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu)了把曼,所有索引的性能也是更好的。 - 怎么驗(yàn)證 mysql 的索引是否滿足需求
使用 explain 查看 SQL 是如何執(zhí)行查詢語句的嗤军,從而分析你的索引是否滿足需求注盈。
explain 語法:explain select * from table where type=1。