我有疑问:
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 |
还有什么其他查询可以给我相同的结果?我必须在优化方面比较两个查询。
答案 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 client
和EXPLAIN SELECT ...
-两者都将为您提供哪些提示/哪些提示不会运行得更快。