Python SQLite3中简单选择查询(使用索引)的性能问题

Python 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

我有一个名为“波形”的表格,有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.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