SQLite学习手册(索引和数据分析/清理)
一、創(chuàng)建索引:
?? ?在SQLite中,創(chuàng)建索引的SQL語法和其他大多數(shù)關(guān)系型數(shù)據(jù)庫基本相同,因為這里也僅僅是給出示例用法:
?? ?sqlite> CREATE TABLE testtable (first_col integer,second_col integer);
?? ?--創(chuàng)建最簡單的索引,該索引基于某個表的一個字段。
?? ?sqlite> CREATE INDEX testtable_idx ON testtable(first_col);
?? ?--創(chuàng)建聯(lián)合索引,該索引基于某個表的多個字段,同時可以指定每個字段的排序規(guī)則(升序/降序)。
?? ?sqlite> CREATE INDEX testtable_idx2 ON testtable(first_col ASC,second_col DESC);
?? ?--創(chuàng)建唯一性索引,該索引規(guī)則和數(shù)據(jù)表的唯一性約束的規(guī)則相同,即NULL和任何值都不同,包括NULL本身。
?? ?sqlite> CREATE UNIQUE INDEX testtable_idx3 ON testtable(second_col DESC);
?? ?sqlite> .indices testtable
?? ?testtable_idx
?? ?testtable_idx2?? ?
?? ?testtable_idx3
?? ?從.indices命令的輸出可以看出,三個索引均已成功創(chuàng)建。
?? ?
二、刪除索引:
?? ?索引的刪除和視圖的刪除非常相似,含義也是如此,因此這里也只是給出示例:?? ?
?? ?sqlite> DROP INDEX testtable_idx;
?? ?--如果刪除不存在的索引將會導(dǎo)致操作失敗,如果在不確定的情況下又不希望錯誤被拋出,可以使用"IF EXISTS"從句。
?? ?sqlite> DROP INDEX testtable_idx;
?? ?Error: no such index: testtable_idx
?? ?sqlite> DROP INDEX IF EXISTS testtable_idx;
三、重建索引:
?? ?重建索引用于刪除已經(jīng)存在的索引,同時基于其原有的規(guī)則重建該索引。這里需要說明的是,如果在REINDEX語句后面沒有給出數(shù)據(jù)庫名,那么當(dāng)前連接下所有Attached數(shù)據(jù)庫中所有索引都會被重建。如果指定了數(shù)據(jù)庫名和表名,那么該表中的所有索引都會被重建,如果只是指定索引名,那么當(dāng)前數(shù)據(jù)庫的指定索引被重建。
?? ?--當(dāng)前連接attached所有數(shù)據(jù)庫中的索引都被重建。
?? ?sqlite> REINDEX;
?? ?--重建當(dāng)前主數(shù)據(jù)庫中testtable表的所有索引。
?? ?sqlite> REINDEX testtable;
?? ?--重建當(dāng)前主數(shù)據(jù)庫中名稱為testtable_idx2的索引。
?? ?sqlite> REINDEX testtable_idx2;
???
四、數(shù)據(jù)分析:
?? ?和PostgreSQL非常相似,SQLite中的ANALYZE命令也同樣用于分析數(shù)據(jù)表和索引中的數(shù)據(jù),并將統(tǒng)計結(jié)果存放于SQLite的內(nèi)部系統(tǒng)表中,以便于查詢優(yōu)化器可以根據(jù)分析后的統(tǒng)計數(shù)據(jù)選擇最優(yōu)的查詢執(zhí)行路徑,從而提高整個查詢的效率。見如下示例:
?? ?--如果在ANALYZE命令之后沒有指定任何參數(shù),則分析當(dāng)前連接中所有Attached數(shù)據(jù)庫中的表和索引。
?? ?sqlite> ANALYZE;
?? ?--如果指定數(shù)據(jù)庫作為ANALYZE的參數(shù),那么該數(shù)據(jù)庫下的所有表和索引都將被分析并生成統(tǒng)計數(shù)據(jù)。
?? ?sqlite> ANALYZE main;
?? ?--如果指定了數(shù)據(jù)庫中的某個表或索引為ANALYZE的參數(shù),那么該表和其所有關(guān)聯(lián)的索引都將被分析。
?? ?sqlite> ANALYZE main.testtable;
?? ?sqlite> ANALYZE main.testtable_idx2;
五、數(shù)據(jù)清理:
?? ?和PostgreSQL中的VACUUM命令相比,他們的功能以及實現(xiàn)方式非常相似,不同的是PostgreSQL提供了更細(xì)的粒度,而SQLite只能將該命令作用于數(shù)據(jù)庫,無法再精確到數(shù)據(jù)庫中指定的數(shù)據(jù)表或者索引,然而這一點(diǎn)恰恰是PostgreSQL可以做到的。
?? ?當(dāng)某個數(shù)據(jù)庫中的一個或多個數(shù)據(jù)表存在大量的插入、更新和刪除等操作時,將會有大量的磁盤空間被已刪除的數(shù)據(jù)所占用,在沒有執(zhí)行VACUUM命令之前,SQLite并沒有將它們歸還于操作系統(tǒng)。由于該類數(shù)據(jù)表中的數(shù)據(jù)存儲非常分散,因此在查詢時,無法得到更好的批量IO讀取效果,從而影響了查詢效率。
?? ?在SQLite中,僅支持清理當(dāng)前連接中的主數(shù)據(jù)庫,而不能清理其它Attached數(shù)據(jù)庫。VACUUM命令在完成數(shù)據(jù)清理時采用了和PostgreSQL相同的策略,即創(chuàng)建一個和當(dāng)前數(shù)據(jù)庫文件相同大小的新數(shù)據(jù)庫文件,之后再將該數(shù)據(jù)庫文件中的數(shù)據(jù)有組織的導(dǎo)入到新文件中,其中已經(jīng)刪除的數(shù)據(jù)塊將不會被導(dǎo)入,在完成導(dǎo)入后,收縮新數(shù)據(jù)庫文件的尺寸到適當(dāng)?shù)拇笮?。該命令的?zhí)行非常簡單,如:
?? ?sqlite> VACUUM;
總結(jié)
以上是生活随笔為你收集整理的SQLite学习手册(索引和数据分析/清理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组concat_js 标准二维数组变一
- 下一篇: oracle数据泵索引创建慢,IMPDP