在大型数据库上编写更快的select查询

时间:2016-03-02 21:59:29

标签: mysql sql mariadb

我有两个表,一个有大约1,000行,一个有700,000行; table1和table2分别。我写了一个简单的选择查询:

SELECT DISTINCT name1
FROM table1, table2
WHERE table1.name1 = table2.name2;

这个问题让我得到了我想要的东西,但耗时91秒!我尝试了这个子查询:

SELECT DISTINCT name1
FROM table1
WHERE table1.name1 IN(SELECT DISTINCT name2 FROM table2);

该查询持续37秒。因此,您编写选择查询的方式会带来一些性能提升。我写了第三个问题:

CREATE TEMPORARY TABLE IF NOT EXISTS t1qry
    (SELECT DISTINCT table1.name1 FROM table1);

CREATE TEMPORARY TABLE IF NOT EXISTS t2qry
    (SELECT DISTINCT table2.name2 FROM table2);

SELECT name2 FROM t2qry JOIN t1qry ON name1 = name2;

DROP TABLE t1qry, t2qry;

这最后一个查询运行时间为0.4秒,并且与其他两个查询产生相同的结果。

我知道每个人都选择不同的'查询花了不到一秒的时间来运行所以我试图制作一个可以在表之间找到共同的不同值的查询。我的问题是为什么我写的东西有效?如何在不创建临时表的情况下编写更快的选择查询?

我一直在使用MySQL和MariaDB,但我会在这里接受任何与SQL相关的帮助。我是SQL的新手,并且一直在努力学习,所以我会采取任何指示或信息。

1 个答案:

答案 0 :(得分:1)

如果您的后一版本(包括创建临时表)速度如此之快,那么您可能在两个表中的nameX上都有索引。

我建议使用exists

SELECT DISTINCT name1
FROM table1
WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.name1 = table2.name2);

对于这些查询,您确实需要table1(name1)table2(name2)上的索引。

而且,如果table1没有重复项,请忽略DISTINCT