MySQL如何有效地比较表之间的多个字段?

MySQL如何有效地比较表之间的多个字段?,mysql,Mysql,所以我的专业知识不是MySQL,所以我写了这个查询,它开始运行得越来越慢,大约5分钟左右,设备数据中有100k行,设备数据标记中有30k左右(对我来说,这是非常少的数据): 我使用此查询将从客户端设备提取的数据行与其数据库中的当前数据进行比较。从这里,我获取临时表,并使用它的ID来做出有条件的决定。我将e_id_字符串编入索引,我将e_id编入索引,其他所有内容都没有。我知道我必须比较所有这些信息看起来很愚蠢,但是客户端系统正在吐出冗余数据,我正在使用这个查询来查找它。无论是SQL还是MySql

所以我的专业知识不是MySQL,所以我写了这个查询,它开始运行得越来越慢,大约5分钟左右,设备数据中有100k行,设备数据标记中有30k左右(对我来说,这是非常少的数据):

我使用此查询将从客户端设备提取的数据行与其数据库中的当前数据进行比较。从这里,我获取临时表,并使用它的ID来做出有条件的决定。我将
e_id_字符串
编入索引,我将
e_id
编入索引,其他所有内容都没有。我知道我必须比较所有这些信息看起来很愚蠢,但是客户端系统正在吐出冗余数据,我正在使用这个查询来查找它。无论是SQL还是MySql管理的另一种方法,在这方面的任何帮助都将不胜感激。我觉得当我在MSSQL中执行类似的操作时,它可以更好地处理请求,但这可能是因为我的某些设置不正确

提示

  • 索引所有必要的列,这些列与
    ON
    WHERE
    条件一起使用 这里需要索引
    eds\u ed\u log\u time
    eds\u id\u string
    eds\u ed\u unit\u type
    eds\u value
    ed\u id
    ed\u log\u time
    ed\u unit type
    ed\u value

  • 将语法更改为
    选择直接连接


字段
ed_e_id
eds_e_id_string
等从何而来?如果使用表别名和显式引用,可以更清楚地看到这里发生了什么。公平地说,我使用我所做的约定命名表和字段的原因是,这样我就不必担心别名问题,因此它更清晰。例如,eds代表设备数据标记,ed代表设备数据,E代表设备。因此,可以根据命名约定推断连接。谢谢你帮我看一下这个!提示:您必须为使用
WHERE
ON
条件的列编制索引。我通过删除和重建表来重新编制表的索引。看来我的成绩不好。如果我通过用新的索引重新构建数据库来解决这个问题,我将在本周末完成这项工作,那么我将接受答案。另外,我肯定没有正确使用直接连接,因为当我更改语法时,它会花费更长的时间。谢谢我将把这个标记为正确答案,因为这是由于我的索引。我不完全理解MySQL是如何进行索引的,但我可以向您保证,如果索引过多,并且存在外键约束,那么速度可能会更慢。我希望我能得到一个更彻底的答案,但迪乔玩弄指数是对的。
   CREATE TEMPORARY TABLE dataCompareTemp 
   SELECT eds.eds_id FROM equipmentdatastaging eds
   INNER JOIN equipment e ON e.e_id_string = eds.eds_e_id_string
   INNER JOIN equipmentdata ed ON e.e_id = ed.ed_e_id 
       AND eds.eds_ed_log_time=ed.ed_log_time 
       AND eds.eds_ed_unit_type=ed.ed_unit_type
       AND eds.eds_ed_value = ed.ed_value