追加sql知识来啦~~
只是介绍一些我知道的哦~~
1. 数据库性能设置
(1)PRAGMA journal_mode = DELETE;
WAL(7500) | 写入数据的时候会将数据先写入到WAL文件中,然后异步地将数据写入到数据库中,提高写入数据的性能,减少锁冲突,但是会占用更多的系统内存,使用WAL模式还需要在关闭数据库之前对WAL文件进行清理,才能保证不会有数据损失。 |
TRUNCATE(5000) | 日志截断为零字节长度。 |
MEMORY(600) | 不安全,日志记录保留在内存中,而不是磁盘上。 |
OFF(500) | 不安全,不保留任何日志记录。 |
PERSIST(4000) | 日志文件保留,头部重写,表明日志不再有效。 |
DELETE(8000) | 默认模式,事务结束时,日志文件将被删。 |
(2)PRAGMA synchronous = NORMAL;
OFF(0) | 不同步,系统崩溃或写入数据时意外断电的情况下数据库可能会损坏。 |
NORMAL(1) | 在事务提交之前,将事务日志写入磁盘。在将数据页更新至磁盘之前,要求操作系统将缓存的数据页写入磁盘。(数据只写入磁盘一次 宕机最近修改的数据可能会丢失)NORMAL模式下有很小的几率(但不是不存在)发生电源故障导致数据库损坏的情况。 |
FULL(2) | 在事务提交之前,将事务日志写入磁盘。在将数据页更新至磁盘之前,同步操作系统缓存的所有文件写入磁盘。(数据写入磁盘多次,相对更安全,紧急时刻保证数据写入磁盘,系统崩溃保证数据库不会损坏,但是写入速度会稍慢一些)。 |
(3)PRAGMA temp_store = FILE;
临时表存储到内存可以提高访问速度,内存空间不足部分临时表会自动被存储到磁盘,需要合理使用内存防止内存溢出 !!!
DEFAULT(0) | 默认使用编译时的模式。通常是 FILE。 |
FILE(1) | 使用基于文件的存储。 |
MEMORY(2) | 使用基于内存的存储。 |
(4)PRAGMA page_size = 32768;
页面大小 数据库最基础的物理单位 sqlite支持范围512-65536
页面越大支持一次读写的数据越多 占用内存变高 减少写磁盘次数
(5)PRAGMA cache_size = 8000;
数据库缓存大小
从缓存中读取提高速度 缓存过大会占用系统内存 降低系统性能
缓存实际包括:页面缓存和语句缓存
页面缓存:缓存数据库的页面数据(PRAGMA cache_size设置)
语句缓存:缓存sql语句的解析结果(PRAGMA cache_spill设置)
2. 数据库查询速度提升——索引
(1)指定索引优化
--------------------------
|table_key table_value |
| 1 value1 |
| 2 value1 |
| 3 value1 |
| 4 value1 |
| ... ... |
--------------------------
CREATE INDEX IF NOT EXISTS table_key_index ON table_name(table_key DESC);
SELECT * FROM table_name INDEXED BY table_key_index WHERE table_value = value1 AND table_key < 10000 ORDER BY table_key DESC LIMIT 1;
当数据库数据量巨大且在sql中出现排序等条件时,数据库速度会变慢,此时对WHRER后的关键条件添加索引(如上table_key添加索引名为table_key_index)后再根据table_key排序时效率将会变高。
(2)联合索引优化
CREATE INDEX IF NOT EXISTS key_value_index ON table_name(table_key,table_value DESC);
同一个表创建多索引时,在一个查询语句的WHERE条件中有多个索引列会导致该查询语句不确定使用哪个索引,有可能会使用慢索引使查询时间更长,可以通过INDEXED BY [索引名] WHERE *** 指定最快的索引 或 使用NOT INDEXED WHERE指定查询不使用索引。
例如上边的表添加了联合索引,仍然可以使用上边的INDEXED BY table_key_index WHERE指定使用key索引。
推荐一个工具Navicat,是我使用过的可视化数据库工具,相对来说比较好用,它的优点就是能打开加密数据库,用起来也比较简单,不知道用什么的新手可试一下~~