MySQL數(shù)據(jù)庫(kù)索引原理及優(yōu)化策略
1 索引
索引概念
索引是一種特殊的文件,包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針??梢詫?duì)表中的一列或多列創(chuàng)建索引,并指定索引的類型,各類索引有各自的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。
索引作用
數(shù)據(jù)庫(kù)中的表、數(shù)據(jù)、索引之間的關(guān)系,類似于書架上的圖書、書籍內(nèi)容和書籍目錄的關(guān)系,索引所起的作用類似書籍目錄,可用于快速定位、檢索數(shù)據(jù)。索引可以極大地提高數(shù)據(jù)庫(kù)的性能。
索引的使用場(chǎng)景
要考慮對(duì)數(shù)據(jù)庫(kù)表的某列或某幾列創(chuàng)建索引,需要考慮以下幾點(diǎn):
- 數(shù)據(jù)量較大,且經(jīng)常對(duì)這些列進(jìn)行條件查詢。
- 該數(shù)據(jù)庫(kù)表的插入操作,及對(duì)這些列的修改操作頻率較低。
- 索引會(huì)占用額外的磁盤空間。
2 索引分類
- 從索引存儲(chǔ)結(jié)構(gòu)劃分:BTree索引、Hash索引、FULLTEXT全文索引、RTree索引
- 從應(yīng)用層次劃分:普通索引,唯一索引,主鍵索引,復(fù)合索引
- 從索引鍵值類型劃分,主鍵索引,輔助索引(二級(jí)索引)
- 從數(shù)據(jù)存儲(chǔ)和索引鍵值邏輯關(guān)系劃分:聚集索引(聚簇索引)非聚集泰引(非聚簇索)
- 從索引列數(shù)量劃分:?jiǎn)瘟兴饕?,?fù)合索引
B樹索引和B+樹索引區(qū)別
區(qū)別:
數(shù)據(jù)的保存位置不同:B+樹保存在葉子節(jié)點(diǎn),B樹保存在所有的節(jié)點(diǎn)中
體現(xiàn)出B+樹優(yōu)勢(shì):節(jié)點(diǎn)不存儲(chǔ)data,這樣一個(gè)節(jié)點(diǎn)就可以存儲(chǔ)更多的key??梢允沟脴涓?,所以IO操作次數(shù)更少。 查詢性能穩(wěn)定:每次查詢都是從根節(jié)點(diǎn)遍歷到葉子節(jié)點(diǎn),查詢路徑長(zhǎng)度相同,即每次查詢效率相當(dāng),時(shí)間復(fù)雜度固定是O(log(n))
葉子節(jié)點(diǎn)的指向:B+樹相鄰的葉子節(jié)點(diǎn)通過(guò)指針相連,B樹沒(méi)有
體現(xiàn)出B+樹優(yōu)勢(shì):所有葉子節(jié)點(diǎn)形成有序鏈表,便于范圍查找
3 索引操作
創(chuàng)建主鍵索引
-- 在創(chuàng)建表的時(shí)候,直接在字段名后指定 primary key create table user1(id int primary key, name varchar(30)); -- 在創(chuàng)建表的最后,指定某列或某幾列為主鍵索引 create table user2(id int, name varchar(30), primary key(id)); -- 創(chuàng)建表以后再添加主鍵 create table user3(id int, name varchar(30)); alter table user3 add primary key(id);
主鍵索引的特點(diǎn):
- 一個(gè)表中,最多有一個(gè)主鍵索引,當(dāng)然可以使符合主鍵
- 主鍵索引的效率高(主鍵不可重復(fù))
- 創(chuàng)建主鍵索引的列,它的值不能為null,且不能重復(fù)
- 主鍵索引的列基本上是int
唯一索引的創(chuàng)建
-- 在表定義時(shí),在某列后直接指定unique唯一屬性。 create table user4(id int primary key, name varchar(30) unique); -- 創(chuàng)建表時(shí),在表的后面指定某列或某幾列為unique create table user5(id int primary key, name varchar(30), unique(name)); -- 創(chuàng)建表以后再添加unique create table user6(id int primary key, name varchar(30)); alter table user6 add unique(name);
唯一索引的特點(diǎn):
- 一個(gè)表中,可以有多個(gè)唯一索引
- 查詢效率高
- 如果在某一列建立唯一索引,必須保證這列不能有重復(fù)數(shù)據(jù)
- 如果一個(gè)唯一索引上指定not null,等價(jià)于主鍵索引
普通索引的創(chuàng)建
--在表的定義最后,指定某列為索引 create table user8(id int primary key, name varchar(20), email varchar(30), index(name) ); --創(chuàng)建完表以后指定某列為普通索引 create table user9(id int primary key, name varchar(20), email varchar(30)); alter table user9 add index(name); -- 創(chuàng)建一個(gè)索引名為 idx_name 的索引 create table user10(id int primary key, name varchar(20), email varchar(30)); create index idx_name on user10(name);
普通索引的特點(diǎn):
- 一個(gè)表中可以有多個(gè)普通索引,普通索引在實(shí)際開發(fā)中用的比較多
- 如果某列需要?jiǎng)?chuàng)建索引,但是該列有重復(fù)的值,那么我們就應(yīng)該使用普通索引
查詢索引
- show keys from 表名
mysql> show keys from goods\G
*********** 1. row ***********
Table: goods <= 表名
Non_unique: 0 <= 0表示唯一索引
Key_name: PRIMARY <= 主鍵索引
Seq_in_index: 1
Column_name: goods_id <= 索引在哪列
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE <= 以二叉樹形式的索引
Comment:
1 row in set (0.00 sec)
- show index from 表名;
- desc 表名
刪除索引
- 刪除主鍵索引: alter table 表名 drop primary key;
- 其他索引的刪除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的Key_name 字段
mysql> alter table user10 drop index idx_name;
- drop index 索引名 on 表名
mysql> drop index name on user8
索引創(chuàng)建原則
- 比較頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
- 唯一性太差的字段不適合單獨(dú)創(chuàng)建索引,即使頻繁作為查詢條件
- 更新非常頻繁的字段不適合作創(chuàng)建索引
- 不會(huì)出現(xiàn)在where子句中的字段不該創(chuàng)建索引
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)索引原理及優(yōu)化策略的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL優(yōu)化配置文件my.ini(discuz論壇)
公司網(wǎng)站訪問(wèn)量越來(lái)越大,MySQL自然成為瓶頸,因此最近我一直在研究 MySQL 的優(yōu)化,第一步自然想到的是 MySQL 系統(tǒng)參數(shù)的優(yōu)化,作為一個(gè)訪問(wèn)量很大的網(wǎng)站(日20萬(wàn)人次以上)的數(shù)據(jù)庫(kù)系統(tǒng),不可能指望 MySQL 默認(rèn)的系統(tǒng)參數(shù)能夠讓 MySQL運(yùn)行得非常順暢。2011-03-03mysql通過(guò)binlog日志復(fù)制主從同步的實(shí)現(xiàn)
本文主要介紹了mysql通過(guò)binlog日志復(fù)制主從同步的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05基于mysql中delete的語(yǔ)法別名問(wèn)題
這篇文章主要介紹了mysql中delete的語(yǔ)法別名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09開啟bin-log日志mysql報(bào)錯(cuò)的解決方法
開啟bin-log日志mysql報(bào)錯(cuò):This function has none of DETERMINISTIC, NO SQL解決辦法,大家參考使用吧2013-12-12Mysql事物鎖等待超時(shí)Lock wait timeout exceeded;的解決
本文主要介紹了Mysql事物鎖等待超時(shí)Lock wait timeout exceeded;的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03如何使用Maxwell實(shí)時(shí)同步mysql數(shù)據(jù)
這篇文章主要介紹了如何使用Maxwell實(shí)時(shí)同步mysql數(shù)據(jù),幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-04-04MySQL查詢數(shù)據(jù)庫(kù)所有表名以及表結(jié)構(gòu)其注釋(小白專用)
查詢數(shù)據(jù)庫(kù)所有表的表名、備注,其實(shí)也是比較常見的操作,這篇文章主要給大家介紹了關(guān)于MySQL查詢數(shù)據(jù)庫(kù)所有表名以及表結(jié)構(gòu)其注釋的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08