【问题标题】:MYSQL performance issue concat in select or in whereMYSQL 性能问题 concat 在 select 或 where
【发布时间】:2011-11-29 22:27:37
【问题描述】:

以前是在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%"; 

提前感谢您的回答。

【问题讨论】:

标签: mysql performance concatenation having sql-execution-plan


【解决方案1】:

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

顺便说一句,您可以找到 pt-visual-explain 来帮助可视化 EXPLAIN 输出。

【讨论】:

    【解决方案2】:

    在这两个版本中,查询都不能使用索引来解析 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%"; 
    

    【讨论】:

    • 我知道这真的很老了,但是两个联合查询并不等同于原始查询。如果人firstName"Dickie" 并且他们的lastName"Boy"。然后搜索Boy Dickie就找不到了。
    猜你喜欢
    • 2018-01-02
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多