SQL:Chaining加入效率

时间:2011-02-10 16:12:28

标签: sql mysql performance

我的WordPress插件中有一个查询:

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
        LEFT JOIN `nwp_usermeta` U 
            ON users.`ID`=U.`user_id` 
        LEFT JOIN `nwp_usermeta` M 
            ON users.`ID`=M.`user_id` 
        LEFT JOIN `nwp_usermeta` C 
            ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
        AND M.meta_key = 'last_name' 
        AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10

我刚开始使用JOIN,我想知道在一个查询中使用这么多JOIN的效率是多少。将它拆分成多个查询会更好吗?

The database schema can be found here.

3 个答案:

答案 0 :(得分:4)

如果键被索引,

JOIN通常不会那么糟糕。 LEFT JOIN几乎总是会受到影响,如果可能的话,你应该避免使用它。不同之处在于LEFT JOIN将连接连接表中的所有行,即使您要加入的列为NULL也是如此。常规(直线)JOIN只会加入匹配的行。

发布您的表格结构,我们可以为您提供更好的查询。

答案 1 :(得分:2)

请参阅此评论:

http://forums.mysql.com/read.php?24,205080,205274#msg-205274

为了了解它的价值,要了解MySQL正在做什么并查看您是否已正确编入索引,请务必查看 EXPLAIN 计划。你可以在查询之前放置EXPLAIN(在查询之前添加单词EXPLAIN),然后运行它。

在您的查询中,您有一个过滤器AND C.meta_key = 'nwp_capabilities',这意味着它上面的所有LEFT JOIN可以同等地写为INNER JOIN。因为如果LEFT JOINS失败(LEFT OUTER旨在保留左侧的结果),结果将被WHERE子句100%过滤掉。

更优化查询

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
        JOIN `nwp_usermeta` U 
            ON users.`ID`=U.`user_id` 
        JOIN `nwp_usermeta` M 
            ON users.`ID`=M.`user_id` 
        JOIN `nwp_usermeta` C 
            ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
        AND M.meta_key = 'last_name' 
        AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10

(注意:“JOIN”(单独)=“INNER JOIN”)

答案 2 :(得分:1)

尝试解释查询以查看正在进行的操作以及您的选择是否已优化。如果您在阅读一些教程之前没有使用过说明:

http://www.learn-mysql-tutorial.com/OptimizeQueries.cfm

http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm