如果是JOIN,Mysql索引如何工作?

时间:2016-04-06 09:52:38

标签: mysql indexing

假设我有两个表patientperson Mysql查询如下所示。

select fname , lname 
from patient p 
left join per on (per.person_id=p.person_id) 
where p.account_id=2 and (per.fname like  'will%'  OR per.lname like 'will%' ).

如果是这个查询,mysql将如何使用在(p.account_id,p.person_id)

上创建的索引

person_idperson表中patient表的外键。

1 个答案:

答案 0 :(得分:1)

我怀疑你不想LEFT。使用LEFT JOIN,您要求的是帐户#2,无论他是否被命名为“will”。

SELECT fname, lname
    FROM patient p
    JOIN per ON per.person_id = p.person_id
    WHERE p.account_id = 2
      AND (per.fname LIKE 'will% OR per.lname LIKE 'will%')

如果是'will',将找到帐号#2的全名,否则不返回任何内容。

您还没有说过您拥有的索引,因此我们无法解释您现有的索引。请为每个表格提供SHOW CREATE TABLE

对于任一版本的查询,这些索引是唯一有用的索引:

p:  INDEX(account_id)  -- if it is not already the PRIMARY KEY
per:  INDEX(person_id)  -- again, if it is not already the PRIMARY KEY.

PRIMARY KEYUNIQUE索引。

第一个索引(或PK)是快速查找以查找account_id=2的行。第二个会使联接运作良好。由于OR

,没有索引对“will”有用

查询将首先查看patient,然后使用“嵌套循环加入”查看per

请同时提供EXPLAIN SELECT ...,以便我们讨论我猜测的事情。