假设我有两个表patient
,person
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_id
是person
表中patient
表的外键。
答案 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 KEY
是UNIQUE
索引。
第一个索引(或PK)是快速查找以查找account_id=2
的行。第二个会使联接运作良好。由于OR
。
查询将首先查看patient
,然后使用“嵌套循环加入”查看per
。
请同时提供EXPLAIN SELECT ...
,以便我们讨论我猜测的事情。