SQL中的慢查询

ame*_*eer 0 sql database performance

即使是中等大小的数据集,我也是一个数据库noobie.我有一个SQL数据库(实际上是多个sql数据库,一个SQLite,Postgres和MySQL数据库)都包含从IMDB转储的相同数据.我想基准这些不同的数据库.我想查询的主表有大约1500万行.我想要一个跨越两部电影的查询,现在我的查询看起来像这样

SELECT * from acted_in INNER JOIN actors 
ON acted_in.idactors = actors.idactors WHERE
(acted_in.idmovies = %d OR acted_in.idmovies = %d)
Run Code Online (Sandbox Code Playgroud)

参数是随机生成的ids.我想通过多次为随机生成的电影运行此查询并查看平均花费的时间来测试数据库的相对速度.我的问题是,有没有更好的方法来做同样的查询,我想加入谁从两部电影中的任何一部分中使用他们的信息,因为这将是我正在进行的项目的核心功能,现在目前单个查询的平均速度是极速的

sqlite: 7.160171360969543
postgres: 8.263306670188904
mysql: 13.27652293920517
Run Code Online (Sandbox Code Playgroud)

这是每个查询的平均时间(仅100个查询的示例空间,但现在足够重要).我可以做得更好吗?对于任何实际使用来说,当前的运行时间是完全不可接受的.我不认为加入需要花费很多时间,通过删除它我得到几乎相同的结果所以我相信查找是需要很长时间的,因为当我不这样做时我没有获得显着的加速使用OR条件加入或查找.

Kei*_*win 5

你在这里没有提到的是在数据库中有任何索引.通常,加速查询的方式(除了非常复杂的查询,这不是),通过向连接中使用的内容或标准添加索引.这会降低更新速度,因为在更新表时需要更新索引,但会大大加快使用这些属性的选择.您可能希望考虑将索引添加到您使用的任何不是主键的属性.确保在所有数据库中使用相同的索引类型是公平的.

  • 除了`idmovies`之外,确保`idactors`在*两个*表中都被索引.您通常希望索引外键的两侧.我的猜测是运行时间下降了20倍.[顺便说一句,在Postgres中添加索引后运行`ANALYZE`命令来更新内部统计数据; 其他DB可能需要一个具有不同名称的类似命令. (2认同)