我的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
的效率是多少。将它拆分成多个查询会更好吗?
答案 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)
尝试解释查询以查看正在进行的操作以及您的选择是否已优化。如果您在阅读一些教程之前没有使用过说明: