1

以前在ms-sql下开发数据库,​​现在转用mysql了。进步很大。问题是我没有任何工具可以以图形方式查看查询执行计划...... EXPLAIN并没有真正帮助。

因此,我需要您对此提出建议:

我将有一个包含大约 50000 个条目的表:以下两个查询给了我相同的结果,但我需要知道在一个巨大的数据库上哪个更高效/更快。在第一个中, concat 在 where 中,而在第二个中,它在 select 中,带有一个 having 子句。

SELECT idPatient, lastName, firstName, idCardNumber 
FROM optical.patient 
WHERE CONCAT(lastName,' ',firstName) LIKE "x%"; 


SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
HAVING formattedName LIKE "x%"; 

提前感谢您的回答。

4

2 回答 2

3

在这两个版本中,查询都不能使用索引来解析 WHERE 并将执行全表扫描。但是,它们等效于:

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%"; 

它可以使用索引lastName

如果您需要通过 2 个字段中的任何一个进行搜索,请使用union

SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE firstName LIKE "x%"; 
UNION 
SELECT idPatient, CONCAT(lastName,' ',firstName) as formattedName, idCardNumber 
FROM optical.patient 
WHERE lastName LIKE "x%"; 
于 2011-10-03T13:40:21.297 回答
1

我不相信您会看到这两个查询之间有任何区别,因为CONCAT在这两种情况下都需要对所有行执行。我也会考虑存储formattedName在数据库中,因为您可以在其上添加索引。这可能是优化查询所能做的最好的事情。

顺便说一句,您可能会发现pt-visual-explain有助于可视化EXPLAIN输出。

于 2011-10-03T13:33:50.100 回答