日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Sqlite数据库中索引的使用、索引的优缺点[转]

發布時間:2024/1/8 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sqlite数据库中索引的使用、索引的优缺点[转] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接1? ?原文鏈接2

3. 索引的種類

1)聚集索引:表中行的物理順序與鍵值的邏輯(索引)順序相同。因為數據的物理順序只能有一種,所以一張表只能有一個聚集索引。如果一張表沒有聚集索引,那么這張表就沒有順序的概念,所有的新行都會插入到表的末尾。對于聚集索引,葉節點即存儲了數據行,不再有單獨的數據頁。就比如說我小時候查字典從來不看目錄,我覺得字典本身就是一個目錄,比如查裴字,只需要翻到p字母開頭的,再按順序找到e。通過這個方法我每次都能最快的查到老師說的那個字,得到老師的表揚。

2)非聚集索引:表中行的物理順序與索引順序無關。對于非聚集索引,葉節點存儲了索引字段值以及指向相應數據頁的指針。葉節點緊鄰在數據之上,對數據頁的每一行都有相應的索引行與之對應。有時候查字典,我并不知道這個字讀什么,那我就不得不通過字典目錄的“部首”來查找了。這時候我會發現,目錄中的排序和實際正文的排序是不一樣的,這對我來說很苦惱,因為我不能比別人快了,我需要先再目錄中找到這個字,再根據頁數去找到正文中的字。?

4.索引與數據的查詢,插入與刪除

1)查詢。查詢操作就和查字典是一樣的。當我們去查找指定記錄時,數據庫會先查找根節點,將待查數據與根節點的數據進行比較,再通過根節點的指針查詢下一個記錄,直到找到這個記錄。這是一個簡單的平衡樹的二分搜索的過程,我就不贅述了。在聚集索引中,找到頁節點即找到了數據行,而在非聚集索引中,我們還需要再去讀取數據頁。

2)插入。聚集索引的插入操作比較復雜,最簡單的情況,插入操作會找到對于的數據頁,然后為新數據騰出空間,執行插入操作。如果該數據頁已經沒有空間,那就需要拆分數據頁,這是一個非常耗費資源的操作。對于僅有非聚集索引的表,插入只需在表的末尾插入即可。如果也包含了聚集索引,那么也會執行聚集索引需要的插入操作。

3)刪除。刪除行后下方的數據會向上移動以填補空缺。如果刪除的數據是該數據頁的最后一行,那么這個數據頁會被回收,它的前后一頁的指針會被改變,被回收的數據頁也會在特定的情況被重新使用。與此同時,對于聚集索引,如果索引頁只剩一條記錄,那么該記錄可能會移動到鄰近的索引表中,原來的索引頁也會被回收。而非聚集索引沒辦法做到這一點,這就會導致出現多個數據頁都只有少量數據的情況。

5. 索引的優缺點
其實通過前面的介紹,索引的優缺點已經一目了然。
先說優點:
? ? 1)大大加快數據的檢索速度,這也是創建索引的最主要的原因
? ? 2)加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
? ? 3)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

再說缺點:
? 1)創建索引需要耗費一定的時間,但是問題不大,一般索引只要build一次
? 2)索引需要占用物理空間,特別是聚集索引,需要較大的空間
? 3)當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度,這個是比較大的問題。

6.索引的使用
? ? ? ?根據上文的分析,我們大致對什么時候使用索引有了自己的想法(如果你沒有,回頭再看一遍。。。)。一般我們需要在這些列上建立索引:
1)在經常需要搜索的列上,這是毋庸置疑的;?
2)經常同時對多列進行查詢,且每列都含有重復值可以建立組合索引,組合索引盡量要使常用查詢形成索引覆蓋(查詢中包含的所需字段皆包含于一個索引中,我們只需要搜索索引頁即可完成查詢)。 同時,該組合索引的前導列一定要是使用最頻繁的列。對于前導列的問題,在后面sqlite的索引使用介紹中還會做討論。
3)在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度,連接條件要充分考慮帶有索引的表。;?

4)在經常需要對范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的,同樣,在經常需要排序的列上最好也創建索引。

5)在經常放到where子句中的列上面創建索引,加快條件的判斷速度。要注意的是where字句中對列的任何操作(如計算表達式,函數)都需要對表進行整表搜索,而沒有使用該列的索引。所以查詢時盡量把操作移到等號右邊。

對于以下的列我們不應該創建索引:
1)很少在查詢中使用的列
2)含有很少非重復數據值的列,比如只有0,1,這時候掃描整表通常會更有效
3)對于定義為TEXT,IMAGE的數據不應該創建索引。這些字段長度不固定,或許很長,或許為空。
當然,對于更新操作遠大于查詢操作時,不建立索引。也可以考慮在大規模的更新操作前drop索引,之后重新創建,不過這就需要把創建索引對資源的消耗考慮在內。總之,使用索引需要平衡投入與產出,找到一個產出最好的點。

7. 在sqlite中使用索引?

1)Sqlite不支持聚集索引,android默認需要一個_id字段,這保證了你插入的數據會按“_id”的整數順序插入,這個integer類型的主鍵就會扮演和聚集索引一樣的角色。所以不要再在對于聲明為:INTEGER PRIMARY KEY的主鍵上創建索引。

2)很多對索引不熟悉的朋友在表中創建了索引,卻發現沒有生效,其實這大多數和我接下來講的有關。對于where子句中出現的列要想索引生效,會有一些限制,這就和前導列有關。所謂前導列,就是在創建復合索引語句的第一列或者連續的多列。比如通過:CREATE INDEX comp_ind ON table1(x, y, z)創建索引,那么x,xy,xyz都是前導列,而yz,y,z這樣的就不是。下面講的這些,對于其他數據庫或許會有一些小的差別,這里以sqlite為標準。在where子句中,前導列必須使用等于或者in操作,最右邊的列可以使用不等式,這樣索引才可以完全生效。同時,where子句中的列不需要全建立了索引,但是必須保證建立索引的列之間沒有間隙。舉幾個例子來看吧:

用如下語句創建索引:

CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);
這里是一個查詢語句:
...WHERE a=5 AND b IN (1,2,3) AND c IS NULL AND d='hello'
這顯然對于abcd四列都是有效的,因為只有等于和in操作,并且是前導列。
再看一個查詢語句:
... WHERE a=5 AND b IN (1,2,3) AND c>12 AND d='hello'
那這里只有a,b和c的索引會是有效的,d列的索引會失效,因為它在c列的右邊,而c列使用了不等式,根據使用不等式的限制,c列已經屬于最右邊。
最后再看一條:
... WHERE b IN (1,2,3) AND c NOT NULL AND d='hello'

索引將不會被使用,因為沒有使用前導列,這個查詢會是一個全表查詢。

其實除了索引,對查詢性能的影響因素還有很多,比如表的連接,是否排序等。影響數據庫操作的整體性能就需要考慮更多因素,使用更對的技巧,不得不說這是一個很大的學問。

最后在android上使用sqlite寫一個簡單的例子,看下索引對數據庫操作的影響。
創建如下表和索引:
?? db.execSQL("create table if not exists t1(a,b)"); ? ? ? ?
? ?db.execSQL("create index if not exists ia on t1(a,b)");
插入10萬條數據,分別對表進行如下操作:
select * from t1 where a='90012'
插入:insert into t1(a,b) values('10008','name1.6982235534984673')
更新:update t1 set b='name1.999999' where a = '887'

刪除:delete from t1 where a = '1010'

數據如下(5次不同的操作取平均值):
操作 ??無索引 ? ?有索引
查詢 ??170ms ?5ms
插入 ??65ms ??75ms
更新 ??240ms ?52ms
刪除 ??234ms ?78ms

? ? ? ? 可以看到顯著提升了查詢的速度,稍稍減慢了插入速度,還稍稍提升了更新數據和刪除數據的速度。如果把更新和刪除中的where子句中的列換成b,速度就和沒有索引一樣了,因為索引失效。所以索引能大幅度提升查詢速度,對于刪除和更新操作,如果where子句中的列使用了索引,即使需要重新build索引,有可能速度還是比不使用索引要快的。對與插入操作,索引顯然是個負擔。同時,索引讓db的大小增加了2倍多。

? ? ? ?還有個要吐槽的是,android中的rawQurey方法,執行完sql語句后返回一個cursor,其實并沒有完成一個查詢操作,我在rawquery之前和之后計算查詢時間,永遠是1ms...這讓我無比苦悶。看了下源碼,在對cursor調用moveToNext這些移動游標方法時,都會最終先調用getCount方法,而getCount方法才會調用native方法調用真正的查詢操作。這種設計顯然更加合理。?

轉載于:https://www.cnblogs.com/flyant/p/4272137.html

總結

以上是生活随笔為你收集整理的Sqlite数据库中索引的使用、索引的优缺点[转]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎影视在线播放 | 在线观看的av网址 | jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 污片免费网站 | 天天天天天天天干 | 嫩草综合| 打开免费观看视频在线播放 | 99日韩精品 | 日韩有码专区 | 午夜视频福利 | 天天做天天爱天天爽综合网 | 亚洲精品久久久久久久蜜桃臀 | 成人爽站w47pw | 一本一道无码中文字幕精品热 | 欧美日韩中文字幕在线视频 | 黑人精品一区二区 | 亚洲三级黄色 | 男女瑟瑟视频 | 日本v片| 日本三级免费看 | 欧美在线免费 | 男女做受视频 | 精品国产黄 | 亚洲一区二区三区中文字幕 | 日本成人中文字幕 | 五月婷婷丁香六月 | 男女在线免费观看 | 爱啪啪影视 | 美女a视频 | 国产视频一区二区在线播放 | 天天干夜夜撸 | 欧美肥老妇视频九色 | 亚洲品质自拍视频网站 | 精品国产一区二区三区日日嗨 | 日日噜噜噜夜夜爽爽狠狠 | 亚洲男人的天堂在线观看 | 黄色大片aaa| 欧美日韩八区 | 日韩一区二区久久 | 国产成人精品一区二区三区网站观看 | 亚洲免费区 | 亚洲精品蜜桃 | 国产精品老熟女一区二区 | 欧州一区 | 91av视频在线观看 | 超碰在线国产 | 成年人网站在线观看视频 | 亚洲熟女乱综合一区二区三区 | www五月 | 欧美性开放视频 | 91综合视频 | 激情欧美综合 | 婷婷影视| 中文字幕高清在线免费播放 | 男人日女人的网站 | 爱福利视频一区 | 噼里啪啦国语版在线观看 | www黄色片 | av导航网站| 日b视频免费观看 | 一区二区视频在线观看 | 亚洲涩涩视频 | 欧美午夜精品理论片a级按摩 | 精品97人妻无码中文永久在线 | 高清av免费观看 | 中文字幕在线亚洲 | 国产欧美三级 | 免费欧美一级片 | 国产精品va无码一区二区 | 一区二区三区欧美在线 | 噜噜噜久久,亚洲精品国产品 | 中文字幕观看视频 | 中文字幕在线视频精品 | 欧美福利片在线观看 | 亚洲av无码成人精品区 | 国产日日操 | 三级av网址| 91九色中文 | 综合精品在线 | 波多野结衣不卡 | 欧日韩在线 | 97精品国产露脸对白 | 成人a网| 四色成人 | 亚洲综合精品国产一区二区三区 | 爱情岛亚洲论坛入口福利 | 久久久午夜影院 | 亚洲自拍偷拍精品视频 | 黄网在线免费观看 | 久久影院午夜理论片无码 | 音影先锋av资源 | 日韩精品人妻中文字幕有码 | 草草视频在线观看 | 亚洲一区二区视频网站 | 成人免费做受小说 | 国产女主播喷水高潮网红在线 | 91麻豆精品国产91久久久久久 | 久久青青热 | 尤物最新网址 |