关于mysql中查询语句的优化

关于mysql中查询语句的优化,mysql,sql,Mysql,Sql,我有一个sql select p1.* from history p1, history p2 where p1.charge = p2.charge and p1.userkey = p2.userkey and p1.invitekey = p2.invitekey and p1.aid!=p2.aid 如果有大量数据,速度会很慢,那么我如何优化它呢?您可以向where子句中使用的列添加索引,这将提高性能。这取决于这些表上已经存在哪些索引

我有一个sql

select p1.* from history p1, history p2   
where p1.charge   =   p2.charge  
and   p1.userkey   =   p2.userkey   
and   p1.invitekey   =   p2.invitekey
and   p1.aid!=p2.aid

如果有大量数据,速度会很慢,那么我如何优化它呢?

您可以向where子句中使用的列添加索引,这将提高性能。

这取决于这些表上已经存在哪些索引。
所以您应该检查一下,然后考虑是否应该添加一个额外的以避免全表扫描

但首先,最好使用语法。
它更具可读性,因为连接条件与搜索条件是分开的

select h1.*, h2.aid as h2_aid
from history h1
join history h2
  on (h2.charge = h1.charge and h2.userkey = h1.userkey and h2.invitekey = h1.invitekey)
where h1.aid != h2.aid
但在您的情况下,您只能从p1中选择这些选项。
因此,我假设可以使用

select *
from history h1
where exists
(
   select *
   from history h2
   where h2.charge = h1.charge 
     and h2.userkey = h1.userkey 
     and h2.invitekey = h1.invitekey
     and h2.aid != h1.aid
)

使用现代连接语法,然后向
ON
子句中的列添加索引,如果它们从中受益的话。请尝试正确使用连接。。。它会帮助你更好。。。根据您的表使用join…我尝试了join和exist,但仍然很慢,但仍然感谢您。@matt根据字段名,我有一种预感,
userkey
上的非唯一索引可能会有所帮助。
aid
上可能已经有一个索引,但由于
的原因,它不会被使用=