两个选项之间的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标准中。