我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数):
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')
表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作:
SELECT COUNT(DISTINCT subscriberid) FROM em_link_data WHERE linkid in (24899,24900,24901,24902);
那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。
如果我将查询重写为联接,则还不到1ms。为什么“ IN”查询中的子查询这么慢,为什么其中包含值的这么快?我无法重写查询(购买的软件),因此希望进行一些调整或提示以加快查询速度!任何帮助表示赞赏。
每次对子查询进行评估时都会执行子查询(无论如何,在MySQL中,并非所有RDBMS都执行),也就是说,您基本上在运行700万个查询!如果可能的话,使用JOIN会将其减少到1。即使添加索引可以提高这些索引的性能,您仍在运行它们。