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;

(0)

相关推荐

  • SQLite教程(一):SQLite数据库介绍

    一.简介: SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB.MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法.事务.数据表和索引等.事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性.下面我们将列举一下SQLite的主要特征: 1). 管理简单,甚至可以认为无需管理.     2). 操作方便,SQLite生成的数据库文件可以在各个

  • SQLite教程(四):内置函数

    一.聚合函数: SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了.这里还需要进一步说明的是,对于所有聚合函数而言,distinct关键字可以作为函数参数字段的前置属性,以便在进行计算时忽略到所有重复的字段值,如count(distinct x). 函数 说明 avg(x) 该函数返回在同一组内参数字段的平均值.对于不能转换为数字值的String和BLOB类型的字段值,如'HELLO',SQLite会将其视为0.

  • SQLite教程(三):数据表和视图简介

    一.创建数据表: 该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则.但是对于一些SQLite特有的规则,我们会给予额外的说明.注:以下所有示例均是在sqlite自带命令行工具中完成的. 1). 最简单的数据表:   复制代码 代码如下: sqlite> CREATE TABLE testtable (first_col integer); 这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因

  • SQLite教程(二):C/C++接口简介

    一.概述: 在SQLite提供的C/C++接口中,其中5个APIs属于核心接口.在这篇博客中我们将主要介绍它们的用法,以及它们所涉及到的核心SQLite对象,如database_connection和prepared_statement.相比于其它数据库引擎提供的APIs,如OCI.MySQL API等,SQLite提供的接口还是非常易于理解和掌握的.     二.核心对象和接口: 1. 核心对象:     在SQLite中最主要的两个对象是,database_connection和prepar

  • SQLite教程(五):数据库和事务

    一.Attach数据库: ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上.如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name.最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的.见如下示例:   复制代码 代码如下: sqlite> CREATE TABLE testtabl

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

    一.创建索引: 在SQLite中,创建索引的SQL语法和其他大多数关系型数据库基本相同,因为这里也仅仅是给出示例用法:   复制代码 代码如下: sqlite> CREATE TABLE testtable (first_col integer,second_col integer);     --创建最简单的索引,该索引基于某个表的一个字段.     sqlite> CREATE INDEX testtable_idx ON testtable(first_col);     --创建联合索

  • MyBatis学习教程(五)-实现关联表查询方法详解

    一.一对一关联  1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR() ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VAR

  • Python使用SQLite和Excel操作进行数据分析

    昨日,女票拿了一个Excel文档,里面有上万条数据要进行分析,刚开始一个字段分析,Excel用的不错,还能搞定,到后来两个字段的分析,还有区间比如年龄段的数据分析,实在是心疼的不行,于是就想给她程序处理之. 当然,我是一直C++和Qt的,当时就想直接Qt+sqlite3写入数据库,然后就各种数据查询就行了,可做起来却发现,她机器上没有Qt环境,没有C++编译器,得,如果配置环境也得几个小时了,可当时根本没有那么多时间来做,幸好,之前还看过一些Python的东西,并且Python环境好配啊,于是就

  • Go语言七篇入门教程五文件及包

    目录 1. 文件处理 1.1 JSON文件 1.1.1 已知JSON结构 1.1.2 未知JSON结构 1.1.3 Encoder & Decoder 1.2 XML文件 1.3 二进制文件 1.4 zip文件 1.4.1 创建zip 1.4.2 读取zip文件 2. 包管理 2.1 包路径 2.2 包声明 如何学习Go 1. 文件处理 1.1 JSON文件 什么是json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 也是在web开发中的前后

  • Python NumPy教程之索引详解

    目录 为什么我们需要 NumPy 使用索引数组进行索引 索引类型 基本切片和索引 高级索引 NumPy 或 Numeric Python 是一个用于计算同质 n 维数组的包.在 numpy 维度中称为轴. 为什么我们需要 NumPy 出现了一个问题,当 python 列表已经存在时,为什么我们需要 NumPy.答案是我们不能直接对两个列表的所有元素执行操作.例如,我们不能直接将两个列表相乘,我们必须逐个元素地进行.这就是 NumPy 发挥作用的地方. 示例 #1: # 演示需要 NumPy 的

  • SQLite教程(十二):锁和并发控制详解

    一.概述: 在SQLite中,锁和并发控制机制都是由pager_module模块负责处理的,如ACID(Atomic, Consistent, Isolated, and Durable).在含有数据修改的事务中,该模块将确保或者所有的数据修改全部提交,或者全部回滚.与此同时,该模块还提供了一些磁盘文件的内存Cache功能.     事实上,pager_module模块并不关心数据库存储的细节,如B-Tree.编码方式.索引等,它只是将其视为由统一大小(通常为1024字节)的数据块构成的单一文件

  • SQLite教程(十四):C语言编程实例代码(2)

    三.高效的批量数据插入: 在给出操作步骤之前先简单说明一下批量插入的概念,以帮助大家阅读其后的示例代码.事实上,批量插入并不是什么新的概念,在其它关系型数据库的C接口API中都提供了一定的支持,只是接口的实现方式不同而已.纵观众多流行的数据库接口,如OCI(Oracle API).MySQL API和PostgreSQL API等,OCI提供的编程接口最为方便,实现方式也最为高效.SQLite作为一种简单灵活的嵌入式数据库也同样提供了该功能,但是实现方式并不像其他数据库那样方便明显,它只是通过一

随机推荐