当前位置: 首页 > 编程笔记 >

SQLite教程(五):索引和数据分析/清理

刘俊语
2023-03-14
本文向大家介绍SQLite教程(五):索引和数据分析/清理,包括了SQLite教程(五):索引和数据分析/清理的使用技巧和注意事项,需要的朋友参考一下

一、创建索引:

    在SQLite中,创建索引的SQL语法和其他大多数关系型数据库基本相同,因为这里也仅仅是给出示例用法:
 


    sqlite> CREATE TABLE testtable (first_col integer,second_col integer);

    --创建最简单的索引,该索引基于某个表的一个字段。

    sqlite> CREATE INDEX testtable_idx ON testtable(first_col);

    --创建联合索引,该索引基于某个表的多个字段,同时可以指定每个字段的排序规则(升序/降序)。

    sqlite> CREATE INDEX testtable_idx2 ON testtable(first_col ASC,second_col DESC);

    --创建唯一性索引,该索引规则和数据表的唯一性约束的规则相同,即NULL和任何值都不同,包括NULL本身。

    sqlite> CREATE UNIQUE INDEX testtable_idx3 ON testtable(second_col DESC);

    sqlite> .indices testtable

    testtable_idx

    testtable_idx2    

    testtable_idx3

 

    从.indices命令的输出可以看出,三个索引均已成功创建。
   
二、删除索引:

    索引的删除和视图的删除非常相似,含义也是如此,因此这里也只是给出示例:

   

    sqlite> DROP INDEX testtable_idx;

    --如果删除不存在的索引将会导致操作失败,如果在不确定的情况下又不希望错误被抛出,可以使用"IF EXISTS"从句。

    sqlite> DROP INDEX testtable_idx;

    Error: no such index: testtable_idx

    sqlite> DROP INDEX IF EXISTS testtable_idx;


三、重建索引:

    重建索引用于删除已经存在的索引,同时基于其原有的规则重建该索引。这里需要说明的是,如果在REINDEX语句后面没有给出数据库名,那么当前连接下所有Attached数据库中所有索引都会被重建。如果指定了数据库名和表名,那么该表中的所有索引都会被重建,如果只是指定索引名,那么当前数据库的指定索引被重建。
 


    --当前连接attached所有数据库中的索引都被重建。

    sqlite> REINDEX;

    --重建当前主数据库中testtable表的所有索引。

    sqlite> REINDEX testtable;

    --重建当前主数据库中名称为testtable_idx2的索引。

    sqlite> REINDEX testtable_idx2;

    

四、数据分析:

    和PostgreSQL非常相似,SQLite中的ANALYZE命令也同样用于分析数据表和索引中的数据,并将统计结果存放于SQLite的内部系统表中,以便于查询优化器可以根据分析后的统计数据选择最优的查询执行路径,从而提高整个查询的效率。见如下示例:
 


    --如果在ANALYZE命令之后没有指定任何参数,则分析当前连接中所有Attached数据库中的表和索引。

    sqlite> ANALYZE;

    --如果指定数据库作为ANALYZE的参数,那么该数据库下的所有表和索引都将被分析并生成统计数据。

    sqlite> ANALYZE main;

    --如果指定了数据库中的某个表或索引为ANALYZE的参数,那么该表和其所有关联的索引都将被分析。

    sqlite> ANALYZE main.testtable;

    sqlite> ANALYZE main.testtable_idx2;


五、数据清理:

    和PostgreSQL中的VACUUM命令相比,他们的功能以及实现方式非常相似,不同的是PostgreSQL提供了更细的粒度,而SQLite只能将该命令作用于数据库,无法再精确到数据库中指定的数据表或者索引,然而这一点恰恰是PostgreSQL可以做到的。
    当某个数据库中的一个或多个数据表存在大量的插入、更新和删除等操作时,将会有大量的磁盘空间被已删除的数据所占用,在没有执行VACUUM命令之前,SQLite并没有将它们归还于操作系统。由于该类数据表中的数据存储非常分散,因此在查询时,无法得到更好的批量IO读取效果,从而影响了查询效率。
    在SQLite中,仅支持清理当前连接中的主数据库,而不能清理其它Attached数据库。VACUUM命令在完成数据清理时采用了和PostgreSQL相同的策略,即创建一个和当前数据库文件相同大小的新数据库文件,之后再将该数据库文件中的数据有组织的导入到新文件中,其中已经删除的数据块将不会被导入,在完成导入后,收缩新数据库文件的尺寸到适当的大小。该命令的执行非常简单,如:
 


    sqlite> VACUUM;

 类似资料:
  • 一、创建索引: 在SQLite中,创建索引的SQL语法和其他大多数关系型数据库基本相同,因为这里也仅仅是给出示例用法: sqlite> CREATE TABLE testtable (first_col integer,second_col integer); --创建最简单的索引,该索引基于某个表的一个字段。 sqlite> CREATE INDEX testtable_idx ON test

  • 本文向大家介绍SQLite教程(五):数据库和事务,包括了SQLite教程(五):数据库和事务的使用技巧和注意事项,需要的朋友参考一下 一、Attach数据库:      ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库

  • 大家好,欢迎阅读 Python 和 Pandas 数据分析系列教程。 Pandas 是一个 Python 模块,Python 是我们要使用的编程语言。Pandas 模块是一个高性能,高效率,高水平的数据分析库。

  • 本文向大家介绍SQLite教程(一):SQLite数据库介绍,包括了SQLite教程(一):SQLite数据库介绍的使用技巧和注意事项,需要的朋友参考一下 一、简介:     SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索

  • 本文向大家介绍mysql索引失效的五种情况分析,包括了mysql索引失效的五种情况分析的使用技巧和注意事项,需要的朋友参考一下 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)      注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引   2.对于多列索引,不是使用的第一部分,则

  • 主要内容:CREATE INDEX 命令,单列索引,唯一索引,组合索引,隐式索引,实例,DROP INDEX 命令,什么情况下要避免使用索引?索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和