类似表上的查询性能差异很大?

时间:2015-11-05 22:04:47

标签: mysql

我正在尝试从一系列MySQL表中选择重复的行。以下查询...

SELECT * 
FROM table_name
WHERE column_name
IN (SELECT *
    FROM (SELECT column_name
          FROM table_name
          GROUP BY column_name
          HAVING COUNT(*) > 1
          ) AS subquery)
);

...在具有相同架构和相似行数的不同表中运行时,会产生截然不同的性能。在一个表中,它在几秒钟内执行,在另一个表中具有相同的数据类型和相似的行数,它在很长一段时间内挂起(目前在30分钟并且正在计数)。对于这种差异有什么可能的解释?

编辑 - 使用EXPLAIN显示所有查询都返回"不可能在阅读const表后注意到#34;对于从属子查询。这可能是提及任何表上没有索引的好时机(我继承了......)。在应该是uniqid列的内容中查找重复值,以便我可以将其转换为正确的主键,这是整个snape搜索的重点。

2 个答案:

答案 0 :(得分:0)

我建议将子查询拆分成临时表。

library(ggplot2)
library(directlabels)

data <- data.frame(X= c("A","B","C","D","X","Y","S","P","L","W"), Y=rnorm(10), Z=rnorm(10))
data$X <- as.character(data$X)
graph <- ggplot(data, aes(data$Y,data$Z))
t2<-theme(                              
        axis.title.x = element_text(face="bold", color="black", size=15),
        axis.title.y = element_text(face="bold", color="black", size=15),
        plot.title = element_text(face="bold", color = "black", size=12),
        axis.text.x = element_text(size=15),
        axis.text.y = element_text(size=15)
)
graph <- graph + geom_point(aes(colour=data$X), size=3) + geom_smooth(method="lm", se=F, size=0.5) +
        xlab("Y") + ylab("Z") +
        geom_vline(xintercept=mean(data$Y), color="red", size=1, linetype=2) + theme_bw() + t2 +
        geom_text(x=740,y=105, label="Avg", size=4.5); graph

direct.label.ggplot(graph)

答案 1 :(得分:0)

根据我的经验,MySQL在优化方面很差

SELECT *
FROM table1
WHERE col1 in (SELECT col2 FROM table2 WHERE ...)

而不是执行子查询,然后在col2中查找所有table1值,它会执行table1的完整扫描,然后在col1中搜索table2.col2 {1}}。

当你写JOIN时,它会更好:

SELECT table1.*
FROM table1
JOIN table2 ON table1.col1 = table2.col2

在您的情况下,这将使用table2的子查询来完成:

SELECT t1.*
FROM table_name AS t1
JOIN (SELECT column_name
      FROM table_name
      GROUP BY column_name
      HAVING COUNT(*) > 1) AS t2
ON t1.column_name = t2.column_name