使用另一个具有相同结果的查询

时间:2019-06-22 14:16:33

标签: mysql optimization

我有疑问:

SELECT Name, Surname, Telephone, PersonID FROM Client WHERE Telephone = 
(SELECT MAX(Telephone) FROM Client) OR PersonID = (SELECT MAX(PersonID) 
FROM Client);

结果:

| Name   | Surname  | Telephone | PersonID    |

| Tyler  | Henry    | 998778781 | 38568215856 |

| Brooke | Thornton | 617196573 | 99412132661 |

还有什么其他查询可以给我相同的结果?我必须在优化方面比较两个查询。

3 个答案:

答案 0 :(得分:1)

您可以使用 UNION优化

SELECT Name, Surname, Telephone, PersonID
FROM Client
WHERE Telephone = (SELECT MAX(Telephone) FROM Client)
UNION
SELECT Name, Surname, Telephone, PersonID
FROM Client
WHERE PersonID = (SELECT MAX(PersonID) FROM Client)

如果所选列的子集为UNIQUE,则查询将返回相同的结果。

给定(Telephone)(PersonID)上的索引,在大表上的查询也应该更快。原因是MySQL不能为每个表和(子)查询使用多个索引。将查询分为两个子查询将允许引擎使用两个索引。

答案 1 :(得分:0)

您可以在单个查询中获得最大值Telephone和最大值PersonID,然后将其联接到表中:

SELECT c.Name, c.Surname, c.Telephone, c.PersonID 
FROM Client c INNER JOIN ( 
  SELECT MAX(Telephone) Telephone, MAX(PersonID) PesronID FROM Client
)m ON m.Telephone = c.Telephone OR m.PersonID = c.PersonID

或使用NOT EXISTS

SELECT Name, Surname, Telephone, PersonID FROM Client c
WHERE 
  NOT EXISTS (
    SELECT 1 FROM Client 
    WHERE Telephone > c.Telephone 
  )
  OR
  NOT EXISTS (
    SELECT 1 FROM Client 
    WHERE PersonID > c.PersonID 
  )

答案 2 :(得分:0)

这取决于您拥有的索引。如果没有INDEX(Telephone)INDEX(PersonID),大多数答案将进行表扫描。

这是另一个竞争者:

( SELECT Name, Surname, Telephone, PersonID
    FROM Client
    ORDER BY Telephone DESC LIMIT 1 )
UNION DISTINCT
( SELECT Name, Surname, Telephone, PersonID
    FROM Client
    ORDER BY PersonID DESC LIMIT 1 )

可能更快,因为它没有子查询。但是,如果两个具有相同的电话或个人ID,则可能给出不同的结果。

我建议您针对数据运行所有公式,以了解哪种方法最好。

如果您想进一步讨论,请提供SHOW CREATE TABLE clientEXPLAIN SELECT ...-两者都将为您提供哪些提示/哪些提示不会运行得更快。