当涉及到即使是中等规模的数据集时,我也是数据库新手。我有一个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条件进行连接或查找时,我不会获得显著的速度。
发布于 2011-08-27 05:59:47
这里您没有提到的是在数据库中有任何索引。通常,提高查询速度的方法(除了写得很糟糕的查询,这不是)是通过向连接或where条件中使用的内容添加索引。这将减慢更新速度,因为索引需要在任何时候更新表,但会大大加快使用这些属性进行选择的速度。您可能希望考虑将索引添加到您使用的任何属性中,这些属性还不是主键。为了公平起见,请确保在所有数据库中使用相同的索引类型。
发布于 2011-08-27 06:50:19
首先,基于数据库的微基准测试非常缺乏信息性,因此您的决策并不是一个好主意。有几十个更好的标准来选择数据库,比如可靠性、高负载下的行为、某些功能的可用性(例如postgres的PostGIS扩展、分区等可扩展语言)、许可证(!!)等等。
第二,如果你想调优你的数据库或者数据库服务器,你需要考虑很多事情。以下是一些重要的问题:
postgres中非常直观的解释功能)来分析对您的用例很重要的查询行为,并根据您从这些分析中学到的信息(例如,额外或其他索引)调整数据库以更好地了解您的数据库服务器,这些都是非常复杂的程序,具有许多影响其行为的设置,并且确保您了解您的数据库所受的工作负载,例如,通过使用pgfouine postgres等工具,其他数据库品牌也存在。
https://stackoverflow.com/questions/7210938
复制相似问题