2011-10-03 93 views
1

我曾经在ms-sql下开发数据库,​​现在我已经移到了mysql。伟大的进步。问题是我没有任何工具查看图形查询执行计划 ... EXPLAIN并没有真正的帮助。MYSQL性能问题concat在选择或在哪里

因此,我需要你在这一个建议:

我有一个表近似50000项: 以下两个查询给了我同样的结果,但我需要知道哪一个会更高效/快速的庞大数据库。 在第一个中,concat在where中,而在第二个中,它在具有having子句的select中。

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%"; 

在此先感谢您的答案。

+0

尝试在这里:HTTP ://www.mysqlperformanceblog.com/ – diEcho

+0

'EXPLAIN EXTENDED'是否提供任何有用的信息? –

回答

1

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

顺便说一下,您可能会发现pt-visual-explain可帮助将EXPLAIN输出可视化。

4

在这两个版本中,查询都无法使用索引来解析WHERE并执行全表扫描。然而,他们equialent到:

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%";