php操作sqlite3
距离上次接触sqlite3已经快一年了,去年这篇文章讲跟着菜鸟教程学python操作sqlite3,https://www.cnblogs.com/lizhaoyao/p/13717381.html
现在回头看看,在php的环境下用sqlite3也是小项目值得选择的。
老生常谈的安装
install sqlite3 php扩展以及GUI工具
sudo apt-get install sqlite3
sudo apt-get install php7.4-sqlite
sudo apt-get install sqlitebrowser
具体代码操作看这里 https://www.runoob.com/sqlite/sqlite-php.html 人家写的很详细了
php官方手册 看这里 https://www.php.net/manual/en/book.sqlite3.php
总结出来最重要的也就是这3个方法
query | 发送查询 |
exec | 更新删除增加修改表结构 |
fetchArray | 获取结果集 |
动手试了试,感觉效率上和mysql读差不多,但是写入可能不太适合并发,毕竟这东西的锁颗粒度太大了。测试了一下写入速度
php sqlite3 insert
1. 不关闭 autocommit每条SQL都自动提交的话
1.1 单条插入 每秒大概 72 条
1.2 insert values 多值 value 放 1000 个 每秒大概 43489 左右
2. 先关闭 autocommit 最后结束再 autocommit
2.1 单条插入 每秒大概 158000 条 (100万条数据在6秒左右插入完成)
2.2 insert values 多值 value 放 1000 个 每秒大概 264340 左右 (100万条数据在3.78秒左右插入完成)
问题是 sqlite 是文件锁 整个数据库文件会被锁住的 适合单机非并发服务器
分析得出 可以使用 insert value 多值的方式 配合 begin commit 这种方式手动提交 能让sqlite3迅速插入上百万数据
$db->exec('BEGIN');
$ret = $db->exec($sql);
$db->exec('COMMIT');
查询的话,这里数据库放了1000万条记录,如果用id查询那很快的,基本上0.3ms左右,如果是其他字段查询的话,立刻就上400ms以上了,即使符合条件的记录只有一条也是这样,看了一下因为我使用了这样的代码
while($row = $ret->fetchArray(SQLITE3_ASSOC)){
$data[]=$row;
}
这样的循环,在最后一次拿不到值的时候会等待很久,不知道是什么问题,还没有深入研究。如下代码可很容易看出问题
$row = $ret->fetchArray(SQLITE3_ASSOC);//这一行执行很快
$row = $ret->fetchArray(SQLITE3_ASSOC);//这一行执行很慢 因为符合的记录只有一条
感觉是如果用ID查,它能知道有多少行记录,如果不是ID,它不知道有多少记录,其实query的时间并不多,但是取结果集的地方就很慢(特别是第二次取结果集),就一直等。
为什么用while这样的方式也是没有办法,它没提供一个类似 result_num这样的方法不知道查询出来的结果集有多少行数据,只能一行行读出来,不得不说这样的话对效率确实堪忧。
总体来说,如果你的逻辑不那么复杂,而且你希望得到一个效率还不错但是读多写少,能为mysql分忧解难的场景解决方案,那用这个还是不错的。
想了一下可以这样设计今后的数据落地方案
1.数据量很小,但是很碎,可以用 xattr 扩展属性(4000字符左右)
2.数据量有,但是还是希望能快速,可以用file json_encode(igbinary_serialize)等方式(适合10000条数据以下的场景)
3.数据量上来了(超过10万),但是还是希望快速,少占用mysql资源,可以采用sqlite3(高速写入读取,读多写少,相当于数据缓存)。我们可以定义和mysql一样的数据库结构,然后在上线前同步数据进来,相当于缓存预热,作为临时存储仓库
4.数据量非常大(超过百万),真的需要永久存储落地,采用mysql方式存储,这里面有成熟的关系型数据库的各种方案。
其实本质上来说 sqlite3 也是读写文件方式的,只不过有一层接口支持规范化并实现了SQL模型,在项目初期或者某些边缘业务用这个性价比很高的(只需要写一个很基础的sqlite3操作类就相当于有了model层)。
我们不要小看了php操作文件数据的速度,其读取和写入都是非常高效率的(不然文件缓存为什么那么好用呢?),当然随着文件增大,数据变多,其效率会越来越慢,所以建议控制文件大小在5M左右(和机器性能有关系),条数控制在10000条内。
就实际业务而言,中小企业的数据大部分表的数据是不会破万,破十万的,只有少部分重要的表会增长到百万,所以用这个能迅速降低mysql的压力,在重要数据接口上面提高其吞吐量!
php操作sqlite3的更多相关文章
- iOS: 学习笔记, 使用FMDatabase操作sqlite3
使用FMDatabase操作sqlite3数据库非常简单和方便 // // main.m // iOSDemo0602_sqlite3 // // Created by yao_yu on 14-6- ...
- IOS数据库操作SQLite3使用详解(转)
iPhone中支持通过sqlite3来访问iPhone本地的数据库.具体使用方法如下1:添加开发包libsqlite3.0.dylib首先是设置项目文件,在项目中添加iPhone版的sqlite3的数 ...
- 【delphi】delphi操作sqlite3
SQLite SQLite是一个老牌的轻量级别的本地文件数据库,完全免费且开源,不需要安装,无须任何配置,当然,这样管理功能就不是很强大了,但是它的主要应用也是在本地数据库,可以说是最简单好用的嵌入式 ...
- Flask:操作SQLite3(0.1)
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 本文介绍了第一次在Flask框架中操作SQLite3数据库的测试,参考了官网的文档Using SQLite 3 wit ...
- litepal更好的操作sqlite3,配置与基本操作
litepal更好的操作sqlite3 配置 在app下的build.gradle中加入 创建litepal.xml配置 在app/src/main下面创建assets,新建litepal.xml & ...
- gorm操作sqlite3,高并发读写如何避免锁库?
1. 场景 这两天一直被这个sqlit3困扰,起因是项目中需要有这样一个中间,中间件承担着API角色和流量转发的角色,需要接收来自至少300个agent的请求数据,和健康检测的请求. 所以当即想到用g ...
- 《Python操作SQLite3数据库》快速上手教程
为什么使用SQLite数据库? 对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用需要全功能的关系型数据库.SQLite的目标则是介于两者之间的中小系统.它有以 ...
- 多人操作sqlite3数据库冲突问题解决方法
问题描述:sqlite3数据放置在某一台电脑的某个共享文件夹下,操作数据库的应用程序安装在同一局域网下的很多台电脑上,由于存在多人同时使用该应用程序,所以存在多人同时操作数据库的情况.经过测试发现,最 ...
- WINDOWS下简单操作SQLITE3
有测试操作的时候,还是很好的说~~~ 找个sqlite3.txt下载 sqlite3.exe db.sqlite3 SQLite version 3.7.13 2012-06-11 02:05:22 ...
- python操作sqlite3的几项问题分析
不同数据库还是有各自特点的,之前自以为熟悉mysql,然后全都照搬到sqlite3上,这样果然是不行的.笔者就近期在使用sqlite3时碰到的问题做了总结分析,并给出相应解决方法,供大家参考. 1.如 ...
随机推荐
- ES6中对数组的数据进行排序
今天在工作中遇到了要对多选数据进行排序的一个功能,在此学习记录一下. 实现效果:点击左边的向下或者向上排序的按钮实现数据的排序. 选择第二个向下排序,结果如下: 具体方法如下: //找到原来需要排序的 ...
- Docker 发布镜像
发布镜像 在 Docker Hub 发布镜像 登陆到 Docker Hub docker login 标记镜像并推送到 Docker Hub docker tag <image>:< ...
- [深度学习] 时间序列分析工具TSLiB库使用指北
TSLiB是一个为深度学习时间序列分析量身打造的开源仓库.它提供了多种深度时间序列模型的统一实现,方便研究人员评估现有模型或开发定制模型.TSLiB涵盖了长时预测(Long-term forecast ...
- 【GaussDB】应用报错 socket is not closed; Urgent packet sent to backend successfully; An I/O error occured while sending to the backend.detail:EOF Exception;
数据库原理差异 会话空闲时间超过sesseion_time后,数据库主动断开,客户端再发起请求,就会报此类错误: 当一个会话连接长时间没有执行SQL或者活动时,会将该会话释放,可以释放缓存避免出现例如 ...
- 记 某List.sort()后排序结果异常
背景:某次查看日志,发现数据不符合预期,希望获取的是降序排序,但是部分数据是乱序的 已知List.sort()方法应该不会出异常,所以应该是判断先后方法出问题了 果然,因为一开始写代码时,没有考虑到差 ...
- 消息队列为什么选用redis?聊聊如何做技术方案选型?
消息队列为什么选用redis?聊聊如何做技术方案选型? 老生常谈,消息队列主要有几大用途: 解耦:下单完成之后,需要订单服务去调用库存服务减库存,调用营销服务加营销数据. 引入消息队列,可以把订单完成 ...
- CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式
近期,第十九届中国图象图形学学会青年科学家会议(简称"会议")在广州召开.会议由中国图象图形学学会(CSIG)主办,琶洲实验室.华南理工大学.中山大学.中国图象图形学学 ...
- docker 修改容器内容后更新镜像的流程
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改保存为一个新的镜像,可以按照以下步骤进行: docker version: 26.1 1. 确保容器运行 首先,确保你正在修改的容器是运 ...
- CPP在内网穿透技术的思考
概述 内网穿透是一种技术,用于在私有局域网(LAN)中的设备与外部网络(如互联网)之间建立通信通道,使得外部设备可以访问内网中的服务.由于内网设备通常位于防火墙或 NAT(网络地址转换)设备之后,外部 ...
- MyBatis——案例——查询-多条件查询(多参数接收的三种方法)
查询-多条件查询 编写接口方法:Mapper接口 参数:所有条件查询 List<Brand> selectByCondition(int status,String com ...