SQL中的慢查询

时间:2011-08-26 21:53:38

标签: sql database performance

即使是中等大小的数据集,我也是一个数据库noobie。我有一个SQL数据库(实际上有多个sql数据库,一个SQLite,Postgres和MySQL数据库)都包含相同的数据dumped from 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)

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

sqlite: 7.160171360969543
postgres: 8.263306670188904
mysql: 13.27652293920517

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

首先,数据库上的微基准测试非常缺乏信息,因此决定它们并不是一个好主意。选择数据库有几十个更好的标准,例如可靠性,重负载下的行为,某些功能的可用性(例如Postgres的PostGIS扩展,分区等可扩展语言),许可证(!!)等等上。

其次,如果您想调整您的数据库或数据库服务器,您需要考虑许多事项。一些重要的:

  • db就像大量内存和快速磁盘一样,因此请使用足够数量的服务器来设置服务器。
  • 使用所有主要数据库提供的查询分析功能(例如pgadmin中用于postgres的非常直观的解释功能)来分析对您的用例很重要的查询行为,并根据您从这些中学到的内容调整数据库分析(例如额外或其他指数)
  • 学习如何理解你的数据库服务器,这些是非常复杂的程序,有很多设置会影响他们的行为和性能
  • 确保您了解数据库所承受的工作量,例如,使用pgfouine等工具进行postgres,其他品牌数据库则存在其他工具。