Python SQLite3中简单选择查询(使用索引)的性能问题
我有一个名为“波形”的表格,有525k行。每行包含7列。只有前5列被索引,因为我在查询中使用了它们 我有一个循环,用不同的输入调用select查询152905次。大约需要5分钟才能完成,因此每次呼叫约2毫秒或每秒约500次查询(QPS) 我认为500 QPS对于我正在进行的查询类型来说有点慢。我还能做些什么来提高性能吗 python和sqlite版本 Python 3.7.5Python SQLite3中简单选择查询(使用索引)的性能问题,python,python-3.x,sqlite,Python,Python 3.x,Sqlite,我有一个名为“波形”的表格,有525k行。每行包含7列。只有前5列被索引,因为我在查询中使用了它们 我有一个循环,用不同的输入调用select查询152905次。大约需要5分钟才能完成,因此每次呼叫约2毫秒或每秒约500次查询(QPS) 我认为500 QPS对于我正在进行的查询类型来说有点慢。我还能做些什么来提高性能吗 python和sqlite版本 Python 3.7.5 打印(sqlite3.version):2.6.0 机器 英特尔(R)Core(TM)i7-4650U CPU@1.70
打印(sqlite3.version)
:2.6.0
机器
英特尔(R)Core(TM)i7-4650U CPU@1.70GHz,带4个CPU(笔记本电脑)
磁盘:SK hynix SH920 mSATA 256GB(平均4K-64线程混合IO速度108MB/s)
内存:8GB
创建表
指数
解释查询计划
解释
一些布拉格语:
如果您对这些列有一个唯一的约束,那么在相同的列上创建第二个索引是没有意义的,顺便说一句,谢谢。我不知道unique会自动创建索引。是的。请参阅我从中查看的唯一约束部分(顺便说一句,我看不到加快查询速度的方法。可能是在玩缓存大小和内存映射pragmas?),它没有显示任何内容。这就是我无知的原因。你这么做了?是 啊打开sqlite数据库很慢;它必须重新解析
sqlite_master
表中的所有DDL语句,以了解数据库的结构,关闭数据库当然会破坏页面缓存,因此它必须再次从磁盘读取所有内容,等等。最好只打开一次,并在程序的整个生命周期中使用该连接。
CREATE TABLE "waveforms" (
"sc_id" integer,
"time" REAL,
"XYpos" TEXT NOT NULL,
"NET" TEXT NOT NULL,
"simulator" TEXT NOT NULL,
"CAT" integer DEFAULT 9,
"csv_file" BLOB NOT NULL,
FOREIGN KEY("sc_id") REFERENCES "scs"("id"),
UNIQUE("sc_id","time","XYpos","NET","simulator")
)
CREATE INDEX "index_waveform" ON "waveforms" (
"sc_id",
"time",
"XYpos",
"NET",
"simulator"
)
explain query plan SELECT sc_id, time, XYpos, NET, simulator FROM waveforms INDEXED BY index_waveform WHERE XYpos="111.95_115.80" AND sc_id=1 AND time=3.98e-09 AND NET="NET_X" AND simulator="simX";
QUERY PLAN
`--SEARCH TABLE waveforms USING COVERING INDEX index_waveform (XYpos=? AND NET=? AND sc_id=? AND time=? AND simulator=?)
explain SELECT sc_id, time, XYpos, NET, simulator FROM waveforms INDEXED BY index_waveform WHERE XYpos="111.95_115.80" AND sc_id=1 AND time=3.98e-09 AND NET="NET_X" AND simulator="simX";
---- ------------- ---- ---- ---- ------------- -- -------------
0 Init 0 18 0 00 Start at 18
1 OpenRead 1 61730 0 k(6,,,,,,) 02 root=61730 iDb=0; index_waveform
2 Integer 1 1 0 00 r[1]=1
3 Real 0 2 0 3.98e-09 00 r[2]=3.98e-09
4 String8 0 3 0 111.95_115.80 00 r[3]='111.95_115.80'
5 String8 0 4 0 NET_X 00 r[4]='NET_X'
6 String8 0 5 0 simX 00 r[5]='simX'
7 SeekGE 1 17 1 5 00 key=r[1..5]
8 IdxGT 1 17 1 5 00 key=r[1..5]
9 Column 1 0 6 00 r[6]=waveforms.sc_id
10 Column 1 1 7 00 r[7]=waveforms.time
11 RealAffinity 7 0 0 00
12 Column 1 2 8 00 r[8]=waveforms.XYpos
13 Column 1 3 9 00 r[9]=waveforms.NET
14 Column 1 4 10 00 r[10]=waveforms.simulator
15 ResultRow 6 5 0 00 output=r[6..10]
16 Next 1 8 1 00
17 Halt 0 0 0 00
18 Transaction 0 0 7 0 01 usesStmtJournal=0
19 Goto 0 1 0 00
Auto Vacuum: None
Automatic IndeX: yes
Foreign Keys: yes
Journal Mode: WAL
Journal Size Limit: -1
Locking Mode: Normal
Max Page Count: 1073741823
Page Size: 4096
Secure Delete: yes
Synchronous: Normal
Temp Store: Default
WAL Auto Checkpoint: 1000