提高查询速度:在巨大的表中从SELECT中简单选择SELECT

时间:2017-03-07 09:01:47

标签: mysql sql sqlyog

我有一个包含3列的表:年龄,姓名,昵称 我想只得到昵称+年龄中名称+年龄根本不存在的名字(+年龄)。

例如:if table:DETAILS包含2行:

  1. 年龄:5岁,姓名:suzi,昵称:suzi
  2. 年龄:2,姓名:gil,昵称:g
  3. 查询将返回:age:2,name:gil

    SELECT d1.AGE, d1.NAME
    FROM DETAILS d1
    WHERE d1.NAME NOT IN (SELECT d2.NICKNAME FROM DETAILS d2 WHERE d2.AGE = d1.AGE)
    

    此查询仅在小数据上运行。 知道如何改进吗?

3 个答案:

答案 0 :(得分:1)

SQL查询性能的关键点是使用索引。所以你必须在查询/加入列中有索引,你需要使用它(通过连接)。

E.g。查询:

SELECT DISTINCT D1.AGE, D1.NAME
FROM DETAILS D1 LEFT JOIN DETAILS D2 ON D1.AGE = D2.AGE
WHERE D1.NAME <> D2.NICKNAME

请注意,您必须事先在列AGE,NAME和NICKNAME上创建索引才能从此查询中充分受益。

答案 1 :(得分:0)

您可以通过以下方式轻松获得结果:

SELECT d1.AGE, 
       CASE WHEN d1.NAME IS NULL
            THEN d1.NIKCNAME ELSE d1.NAME END as [NewName]
FROM DETAILS d1
INNER JOIN DETAILS d2
    ON d1.AGE = d2.AGE 
WHERE d2.NAME <> d1.NICKNAME

答案 2 :(得分:0)

使用左连接/左外连接而不是WHERE ... NOT IN ...

执行SQL的命令

  1. FROM
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 选择
  9. DISTINCT
  10. ORDER BY
  11. TOP