Mysql 帮助优化查询-运行需要15秒

Mysql 帮助优化查询-运行需要15秒,mysql,query-optimization,Mysql,Query Optimization,我意识到这是一个相当大的问题,显然有很多事情要做。此查询的第二行(从第二行到最后一行)比较text字段的MD5散列。我尝试了这个方法,而不是比较这些值,但它根本没有减少查询执行时间 sob_数据中的字段可以通过sob_数据相互链接,此查询比较两个表单的值(每个表单在sob_数据中有517行),并提取不共享相同值的链接表单 SELECT sob_datas.id, sob_datas.sob_field_name

我意识到这是一个相当大的问题,显然有很多事情要做。此查询的第二行(从第二行到最后一行)比较
text
字段的MD5散列。我尝试了这个方法,而不是比较这些值,但它根本没有减少查询执行时间

sob_数据
中的字段可以通过
sob_数据
相互链接,此查询比较两个表单的值(每个表单在
sob_数据
中有517行),并提取不共享相同值的链接表单

SELECT
                sob_datas.id,
                sob_datas.sob_field_name
            FROM sob_datas
            WHERE sob_form_id = '.$formId.' AND
            EXISTS(SELECT
                    sob_datas_to_links.id
                FROM sob_datas_to_links
                INNER JOIN sob_datas AS sub_sob_datas ON 
                    sub_sob_datas.id = sob_datas_to_links.sob_datas_id
                INNER JOIN sob_forms ON (
                    sob_forms.id = sub_sob_datas.sob_form_id AND
                    sob_forms.is_proof = 0 AND
                    sob_forms.archived IS NULL
                )
                WHERE sob_datas_to_links.link_id = (
                        SELECT
                            link_id
                        FROM sob_datas_to_links AS sub_sob_datas_to_links
                        WHERE sub_sob_datas_to_links.sob_datas_id = sob_datas.id
                    ) AND
                    sub_sob_datas.sob_field_name = sob_datas.sob_field_name AND
                    sub_sob_datas.hash != sob_datas.hash
            )


我的脑袋快要爆炸了(与这个问题无关,但与数据库有关),但我希望这能让你了解我的想法。尝试一个自连接(但不是这一个,我确信它不会像我现在这样工作,因为我现在无法尝试弄清楚您的表模式和所有那些jazz

SELECT DISTINCT sob_datas.id, sob_datas.sob_field_name 
FROM sob_datas as A1 
  INNER JOIN sob_datas as A2 
    ON A1.sob_forms_ID = A2.sob_forms_ID
  JOIN sob_forms 
    ON A1.sob_forms_ID = sob_forms.id
    AND A2.sob_forms_ID = sob_forms.id
WHERE A1.hash != A2.hash 
  AND sob_forms.is_proof = 0
  AND sob_forms.archived IS NULL;

我们也可以使用表定义吗?请删除子选择并使用联接。另外,如果适用,我希望
$formId
受到保护。我想不出如何使用联接来减少子查询。因此,请专注于减少回答您的问题时必须进行的猜测,根据您的查询重新创建表是非常必要的顺便说一句,您所需要做的就是为所使用的表粘贴showcreatetable的输出。
SELECT DISTINCT sob_datas.id, sob_datas.sob_field_name 
FROM sob_datas as A1 
  INNER JOIN sob_datas as A2 
    ON A1.sob_forms_ID = A2.sob_forms_ID
  JOIN sob_forms 
    ON A1.sob_forms_ID = sob_forms.id
    AND A2.sob_forms_ID = sob_forms.id
WHERE A1.hash != A2.hash 
  AND sob_forms.is_proof = 0
  AND sob_forms.archived IS NULL;