数据库索引实验
上周客戶(hù)的系統(tǒng)有一個(gè)網(wǎng)頁(yè)反應(yīng)超級(jí)緩慢,最后幫客戶(hù)定位到原因是sql慢查詢(xún),在這兒簡(jiǎn)單總結(jié)一下。
當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)量非常大的時(shí)候,數(shù)據(jù)庫(kù)訪問(wèn)的速度會(huì)越來(lái)越慢,cpu和內(nèi)存消耗變大,影響用戶(hù)體驗(yàn),可以通過(guò)創(chuàng)建索引來(lái)解決。
我做了一個(gè)實(shí)驗(yàn)驗(yàn)證了一下,效果非常明顯。
首先創(chuàng)建了一個(gè)數(shù)據(jù)表,通過(guò)腳本插入了1400w條數(shù)據(jù)(腳本跑了一晚上);
之后通過(guò)一個(gè)字段(非主鍵)進(jìn)行查詢(xún)
結(jié)果如上圖所示,查詢(xún)用時(shí)近10秒,這個(gè)速度確實(shí)是非常慢了。
之后我再給“property”這個(gè)字段創(chuàng)建索引
create index pindex on property(property);之后再進(jìn)行相同的操作,結(jié)果如下:
這次耗時(shí)幾乎為0
實(shí)驗(yàn)證明創(chuàng)建索引的確能非常明顯的增加查詢(xún)性能
索引工作原理其實(shí)很簡(jiǎn)單,如果通過(guò)某個(gè)字段(非主鍵)進(jìn)行查詢(xún),此時(shí)數(shù)據(jù)庫(kù)會(huì)進(jìn)行全表掃描,非常消耗資源。創(chuàng)建索引后,數(shù)據(jù)庫(kù)會(huì)把創(chuàng)建索引的這個(gè)字段拿出來(lái),重新分配資源建立索引,就像一本書(shū)的目錄一樣。
創(chuàng)建索引后,sql執(zhí)行的時(shí)候會(huì)自動(dòng)判斷該字段有沒(méi)有索引。
索引分:唯一索引、非唯一索引、主鍵索引、聚集索引。
創(chuàng)建非唯一索引的方法:
create index index_name on table_name(colunm_name);
查看索引的方法:
show index from table_name;
刪除索引的方法:
drop index index_name on table_name;
當(dāng)然索引也是有弊端的,索引會(huì)降低插入數(shù)據(jù)的效率,因?yàn)槊看卧鰟h改數(shù)據(jù)的時(shí)候同時(shí)也需要?jiǎng)?chuàng)建一份索引的數(shù)據(jù)結(jié)構(gòu),增加了資源消耗,另外索引也是需要占用一部分磁盤(pán)空間的。
除了創(chuàng)建索引之外,還有其它一些方法可以在一定程度上降低sql慢查詢(xún)。
1.避免全表查詢(xún)的操作;
2.避免使用select * from 的操作,需要什么字段就查什么字段;
3.避免使用!= 、in、not in、or、like等不確定查詢(xún)的語(yǔ)句;
4.避免在sql語(yǔ)句where之前進(jìn)行計(jì)算的查詢(xún);
?
總結(jié)
- 上一篇: addEventListener与att
- 下一篇: 什么是句柄/底层绘图函数