两个选项之间的MySQL查询性能

两个选项之间的MySQL查询性能,mysql,sql,Mysql,Sql,我已经编写了两个返回相同结果的查询,但我希望使用性能更好的查询 SELECT ID, INTERESTS FROM users WHERE CITY = (SELECT CITY FROM users WHERE ID = 124) SELECT b.ID, b.INTERESTS FROM users a, users b WHERE a.CITY = b.CITY AND a.ID = 124 首先,您应该停止在FROM子句中使用带有逗号的古语语法。简单规则:在FROM子句中不

我已经编写了两个返回相同结果的查询,但我希望使用性能更好的查询

SELECT ID, INTERESTS 
FROM users 
WHERE CITY = (SELECT CITY FROM users WHERE ID = 124)

SELECT b.ID, b.INTERESTS 
FROM users a, users b 
WHERE a.CITY = b.CITY AND a.ID = 124 

首先,您应该停止在
FROM
子句中使用带有逗号的古语语法。简单规则:在
FROM
子句中不要使用逗号;始终使用显式
JOIN
语法

其次,最好通过检查系统上数据的性能来处理性能问题

您的第二个查询正确地写为:

SELECT b.ID, b.INTERESTS
FROM users a JOIN
     users b 
     ON a.CITY = b.CITY AND a.ID = 124 ;
这应该有良好的性能。有时
存在
的性能会稍好一些:

select u2.*
from users u
where exists (select 1 from users u where u.city = u2.city and and u.id = 124);
一些想法
  • 对于两个查询,请查看
    EXPLAIN
    计划,了解mysql是如何限制数据的
  • 你可以通过跑步来做到这一点

    EXPLAIN SELECT ID,INTERESTS FROM users WHERE CITY = (SELECT CITY FROM users WHERE ID=124)
    EXPLAIN SELECT b.ID,b.INTERESTS FROM users a,users b WHERE a.CITY = b.CITY AND a.ID=124 
    
    CREATE INDEX idx_city ON users(CITY);
    
    我发现,在根据查询的解释计划优化查询时,这是一本非常好的读物

    <> LI>良好的性能,因为您基本上加入了<代码>城市< /代码>列,请考虑在<代码>用户表中创建< <代码>城市>代码>列的索引。 索引是空间和性能之间的折衷

    您可以通过运行

    EXPLAIN SELECT ID,INTERESTS FROM users WHERE CITY = (SELECT CITY FROM users WHERE ID=124)
    EXPLAIN SELECT b.ID,b.INTERESTS FROM users a,users b WHERE a.CITY = b.CITY AND a.ID=124 
    
    CREATE INDEX idx_city ON users(CITY);
    

    这样做可以使两个查询都能很好地执行。

    检查执行计划。。或者给它们计时。在生产规模数据上进行测试。如果你说不出来,那没关系。此外,您还应该学习使用ANSI连接——它们自1992年以来就一直在SQL标准中。