我正在使用需要优化查询的数据库,我想知道哪些查询是优化的,我使用了计时器但结果太近了。所以我不必知道使用哪一个。
QUERY 1:
SELECT A.MIG_ID_ACTEUR, A.FL_FACTURE_FSL , B.VAL_NOM,
B.VAL_PRENOM, C.VAL_CDPOSTAL, C.VAL_NOM_COMMUNE, D.CCB_ID_ACTEUR
FROM MIG_FACTURE A
INNER JOIN MIG_ACTEUR B
ON A.MIG_ID_ACTEUR= B.MIG_ID_ACTEUR
INNER JOIN MIG_ADRESSE C
ON C.MIG_ID_ADRESSE = B.MIG_ID_ADRESSE
INNER JOIN MIG_CORR_REF_ACTEUR D
ON A.MIG_ID_ACTEUR= D.MIG_ID_ACTEUR;
QUERY 2:
SELECT A.MIG_ID_ACTEUR, A.FL_FACTURE_FSL , B.VAL_NOM, B.VAL_PRENOM,
C.VAL_CDPOSTAL, C.VAL_NOM_COMMUNE, D.CCB_ID_ACTEUR
FROM MIG_FACTURE A , MIG_ACTEUR B, MIG_ADRESSE C, MIG_CORR_REF_ACTEUR D
WHERE A.MIG_ID_ACTEUR= B.MIG_ID_ACTEUR
AND C.MIG_ID_ADRESSE = B.MIG_ID_ADRESSE
AND A.MIG_ID_ACTEUR= D.MIG_ID_ACTEUR;
答案 0 :(得分:4)
如果您询问使用SQL 99连接语法(a inner join b
)是否更有效,或者使用较早的连接语法来更有效地列出WHERE
中的连接谓词条款,这不重要。我希望这两个查询的查询计划是相同的。如果查询计划相同,则性能将相同。如果计划不相同,那通常意味着您在数据库的查询解析引擎中遇到了错误。
就个人而言,我使用SQL 99语法(查询1),因为当你想要进行外连接时它更具可移植性,并且因为它通常使查询更具可读性并降低你的概率。 ; ll意外地忽略了连接条件。但这仅仅是一种可读性和可维护性考虑因素,而不是性能考虑因素。
答案 1 :(得分:2)
首先要做的事情:
"我使用了计时器但结果太近了#34; - 这实际上不是测试性能的好方法。数据库有缓存。你得到的结果不会与秒表相媲美。你有系统负载来应对,缓存和其他一百万个让这种特殊比较变得毫无价值的东西。而不是那样,尝试使用EXPLAIN来计算执行计划。使用SHOW PROFILES和SHOW STATUS查看查询在何处以及如何花费时间。检查last_query_cost。但是不要检查你的秒表。那不会告诉你什么。
第二:这个问题无法通过您提供的信息得到解答。事实上,查询是相同的(使用Explain验证)并简单地归结为隐式和显式连接。但是,它们中的任何一个都没有被优化。同样,您需要深入了解连接本身,看看它是否正在使用索引,或者它是否正在进行大量的临时表或文件排序。
优化查询是件好事......但这两者是相同的。秒表不会帮助你。使用说明,显示配置文件,显示状态....而不是秒表: - )