我有一个以整数时间戳作为主键的表。几乎该表上的每个查询都属于该模式
SELECT * FROM table WHERE timestamp BETWEEN x AND y
这些范围通常明显小于邮票的总范围。插入很少发生,通常在每个其他现有邮票之后的时间戳处发生。
我能否以某种方式告诉我的数据库(SQLite)保持这些条目“排序”,然后仅从开始时间戳进行选择,从那里搜索行,然后在超过结束时间戳时立即停止以避免有扫描整个表并比较每一行的值?或者这已经发生了?
我有一个以整数时间戳作为主键的表。几乎该表上的每个查询都属于该模式
SELECT * FROM table WHERE timestamp BETWEEN x AND y
这些范围通常明显小于邮票的总范围。插入很少发生,通常在每个其他现有邮票之后的时间戳处发生。
我能否以某种方式告诉我的数据库(SQLite)保持这些条目“排序”,然后仅从开始时间戳进行选择,从那里搜索行,然后在超过结束时间戳时立即停止以避免有扫描整个表并比较每一行的值?或者这已经发生了?
这里是 SQL 初学者,请多多包涵。
假设我有一个songs
看起来像这样的简化表
ID | 标题 |
---|---|
1 | 恶棍 |
2 | 更多的 |
3 | 更多(拉兹洛混音) |
我也有一张桌子songartists
:
歌曲编号 | 艺术家 |
---|---|
1 | K/DA |
2 | K/DA |
2 | 塞拉芬 |
3 | K/DA |
3 | 塞拉芬 |
3 | 拉斯洛 |
假设我要查找 和 的歌曲K/DA
,Seraphine
这意味着没有只有两位艺术家中的一位的歌曲,也没有包含这两位艺术家以及其他艺术家的歌曲。
这是一些在技术上可以满足我要求的代码,但速度很慢:
SELECT title FROM songs WHERE
EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id and songartists.artist == "K/DA")
AND
EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id and songartists.artist == "Seraphine")
AND
NOT EXISTS (SELECT * FROM songartists WHERE songartists.song_id == songs.id AND songartists.artist NOT IN ("K/DA","Seraphine"))
显然,我也可以对标题进行非常简单的查找,然后对艺术家进行比较并以编程方式进行比较。但是有没有一个高性能的 SQL 解决方案呢?