mysql聚簇索引abc_索引优化_MySQL开发教程_IT技术个人博客
索引優化
1、避免聚簇索引頁分裂
聚簇索引優勢:根據主鍵查詢條目比較少時,不用回行(數據就在主鍵節點下)
聚簇索引劣勢:如果碰到不規則數據插入時,造成頻繁的頁分裂
原則:
聚簇索引的主鍵值,應盡量是連續增長的整型值,而不是要是隨機值
比如:不要用隨機字符串或UUID,否則會造成大量的頁分裂與頁移動
例如:int(10) unsigned NOT NULL AUTO_INCREMENT
2、不能在where條件常用的列上都加上索引
例:where cat_id=3 and price>100 ; //查詢第3個欄目,100元以上的商品
誤:cat_id上,和, price上都加上索引。
錯:只能用上cat_id或Price索引。
原因:因為是兩個針對整表的獨立索引,所以同時只能用上1個。
3、多列索引-左前綴
建立多列的聯合索引,必須滿足左前綴原則才能生效,中間不能斷,斷線后面部分不能使用索引。
以 index(a,b,c) 為例:
語句
索引是否發揮作用
Where a=3
是,只使用了a列
Where a=3 and b=5
是,使用了a,b列
Where a=3 and b=5 and c=4
是,使用了abc
Where b=3 / where c=4
否
Where a=3 and c=4
a列能發揮索引,c不能
Where a=3 and b>10 and c=7
a能利用,b能利用, c不能利用
Where a=3 and b like ‘xxxx%’ and c=7
a能用,b能用,c不能用
(1)理解說明:
索引是按照索引定義的順序來進行使用,也就是右邊的索引使用的前提是左邊的索引查詢必須使用等號(能唯一確定一個值),如果是>,
(2)經典案例
假設某個表有一個聯合索引(c1,c2,c3,c4),判斷索引使用情況:
A where c1=x and c2=x and c4>x and c3=x
B where c1=x and c2=x and c4=x order by c3
C where c1=x and c4= x group by c3,c2
D where c1=x and c5=x order by c2,c3
E where c1=x and c2=x and c5=? order by c2,c3
測試解析如下:
// 創建一個表
create table t4 (
c1 tinyint(1) not null default 0,
c2 tinyint(1) not null default 0,
c3 tinyint(1) not null default 0,
c4 tinyint(1) not null default 0,
c5 tinyint(1) not null default 0,
index c1234(c1,c2,c3,c4)
);
// 插入數據
insert into t4 values (1,3,5,6,7),(2,3,9,8,3),(4,3,2,7,5);
// 解析如下:
// 對于A:c1,c2,c3,c4四列都可以用上
c1=x and c2=x and c4>x and c3=x
等價于 c1=x and c2=x and c3=x and c4>x
explain select * from t4 where c1=1 and c2=2 and c4>3 and c3=3;
// 對于B:c1,c2索引用上了,在c2用到索引的基礎上,c3是排好序的,因此不用額外排序,而c4沒發揮作用
explain select * from t4 where c1=1 and c2=2 and c4=3 order by c3;
// 對于C:只用到c1索引,因為group by c3,c2的順序無法利用c2,c3索引
explain select * from t4 where c1=1 and c4=2 group by c3,c2;
// 分組統計首先是按分組字段有序排列,首先按c2,c3排序,由于c1使用索引,且c2,c3有序,因此不會使用臨時表,也不會使用文件排序。
explain select * from t4 where c1=1 and c4=2 group by c2,c3;
// 對于D:c1確定的基礎上,c2是有序的,C2之下C3是有序的,因此c2,c3的索引發揮的排序的作用,沒用到filesort。總的來說c1使用了索引
explain select * from t4 where c1=1 and c5=2 order by c2,c3;
// 對于E:因為c2的值既是固定的,參與排序時并不考慮,c1,c2,c3用上了,c1,c2用于基礎,c3用于排序。等價于
explain select * from t4 where c1=1 and c2=3 and c5=2 order by c3;;
4、對于左前綴不易區分的列,另辟蹊徑
比如:url列http://www.baidu.com 列的前11個字符都是一樣的,不易區分, 可以用如下2個辦法來解決。
(1)把列內容倒過來存儲,并建立索引
moc.udiab.www//:ptth 這樣左前綴區分度大
(2)采用偽hash
同時存儲url和crc32(url)列,然后給crc列建立索引
原因:rc的結果是32位int無符號數,因此當數據超過40億,也會有重復,但這是值得的。(索引長度為int 4個字節)
5、索引覆蓋
索引覆蓋是指如果查詢的列恰好是索引的一部分,那么查詢只需要在索引文件上進行,不需要回行到磁盤再找數據.,這種查詢速度非常快,稱為”索引覆蓋”。
優點:
( 1)索引條目通常比數據行小,只需要讀取索引,所以會訪問更少的數據。
(2)索引是按照列值的大小順序存儲的,對于隨機訪問記錄,需要更少的I/O。
(3)大多數據引擎能更好的緩存索引,比如MyISAM只緩存索引
(4)索引覆蓋對于InnoDB表尤其有用,因為InnoDB使用聚集索引組織數據,二級索引在葉子節點中保存了行的主鍵值,所以如果二級主鍵能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢。
注意:
(1)索引覆蓋也并不適用于任意的索引類型,索引必須存儲列的值
(2)Hash 和full-text索引不存儲值,因此MySQL只能使用B-TREE
(3)不同的存儲引擎實現覆蓋索引都是不同的
(4)并不是所有的存儲引擎都支持它們
(5)如果要使用覆蓋索引,一定要注意SELECT 列表值取出需要的列,不可以是SELECT *,因為如果將所有字段一起做索引會導致索引文件過大,查詢性能下降,不能為了利用覆蓋索引而這么做。
6、優化索引與排序
排序可能發生2種情況:
(1)對于覆蓋索引,直接在索引上查詢時,就是有順序的,using index
在innodb引擎中,沿著索引字段排序,也是自然有序的。
對于myisam引擎,如果按某索引字段排序,如id,但取出的字段中,有未索引字段,如goods_name,myisam的做法,不是索引->回行,而是先取出所有行,再進行排序。
(2)先取出數據,形成臨時表做filesort(文件排序,但文件可能在磁盤上,也可能在內存中)。
理想目標
取出來的數據本身就是有序的,利用索引來排序,盡量不出現using filesort。
7、避免重復索引與適當冗余索引
重復索引
重復索引是指在同1個列(如age),或者順序相同的幾個列(age,school), 建立了多個索引稱為重復索引。
重復索引沒有任何幫助,只會增大索引文件,拖慢更新速度,必須去掉。
冗余索引
冗余索引是指2個索引所覆蓋的列有重疊,,稱為冗余索引。
比如 x,m,列, 加索引 index x(x), index xm(x,m),x,xm索引,兩者的x列重疊了, 這種情況,稱為冗余索引。
甚至可以把 index mx(m,x) 索引也建立mx, xm 也不是重復的,因為列的順序不一樣。
8、理想索引
(1)查詢頻繁
(2)區分度高
(3)長度小
(4)盡量能覆蓋常用查詢字段
區分度與長度
由于索引長度直接影響索引文件的大小,影響增刪改的速度,并間接影響查詢速度(占用內存多)。所以針對列中的值,從左往右截取部分,來建索引。
(1)截的越短, 重復度越高,區分度越小,索引效果越不好
(2)截的越長, 重復度越低,區分度越高, 索引效果越好,但帶來的影響也越大(增刪改變慢,并間影響查詢速度)
所以,我們要在 區分度 + 長度 兩者上,取得一個平衡。
慣用手法:
截取不同長度,并測試其區分度
對于一般的系統應用:區別度能達到0.1,索引的性能就可以接受
select count(distinct left(word,6))/count(*) from dict;
9、定期索引碎片與維護
在長期的數據更改過程中,索引文件和數據文件,都將產生空洞,形成碎片。
通過以下兩種方式來修復損壞的表:
alter table xxx engine innodb
optimize table 表名
注意:
(1)修復表的數據及索引碎片,就會把所有的數據文件重新整理一遍,使之對齊。這個過程,如果表的行數比較大,也是非常耗費資源的操作。所以,不能頻繁的修復。
(2)如果表的Update操作很頻率,可以按周/月,來修復。如果不頻繁,可以更長的周期來做修復,比如半年或年。
總結
以上是生活随笔為你收集整理的mysql聚簇索引abc_索引优化_MySQL开发教程_IT技术个人博客的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艾默生流量计旗下其他产品的特点以及应用概
- 下一篇: 【DDLC(心跳文学部)mod版分享】