2012-07-02 78 views
0

我在与我的MySQL声明实际问题的问题,我需要加入几桌一起,从另一个表的平均值的对它们进行查询和秩序。这是我有...与MySQL查询(效率)

SELECT 
    ROUND(avg(re.rating), 1)AS avg_rating, 
     s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive 
    FROM staff s 

    INNER JOIN staff_homes sh 
    ON s.staff_id=sh.staff_id 
    INNER JOIN staff_positions sp 
    ON s.staff_id=sp.staff_id 
    INNER JOIN reliability re 
    ON s.staff_id=re.staff_id 
    INNER JOIN availability ua 
    ON s.staff_id=ua.staff_id 

    GROUP BY staff_id 
    ORDER BY avg_rating DESC 

现在我相信这个工作,虽然我得到这个错误“SELECT将审查比使用max_join_size行以上;检查你的WHERE和使用SET SQL_BIG_SELECTS = 1或SET SQL_MAX_JOIN_SIZE = #如果SELECT是好的“。

我想这意味着我有太多的连接和因为它是托管共享它不会允许大型查询运行,我不知道。

我想知道的是什么错误的手段(我用Google搜索,但我不明白的答案),我怎么可以也许使我的查询更高效的工作轮呢?

任何帮助,将不胜感激。由于

编辑:

我需要加入的原因是这样我就可以查询基于像这样的搜索功能的表...

 SELECT 
ROUND(avg(re.rating), 1)AS avg_rating 

, s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive 
FROM staff s 

INNER JOIN staff_homes sh 
ON s.staff_id=sh.staff_id 
INNER JOIN staff_positions sp 
ON s.staff_id=sp.staff_id 
INNER JOIN reliability re 
ON s.staff_id=re.staff_id 
INNER JOIN availability ua 
ON s.staff_id=ua.staff_id 

WHERE s.full_name LIKE '%' 
AND s.drive = '1' 
AND sh.home_id = '3' 
AND sh.can_work = '1' 
AND sp.position_id = '3' 
AND sp.can_work = '1' 


GROUP BY staff_id 
ORDER BY avg_rating DESC 

EDIT 2

这是我的解释结果。另外我对MYSQL不太好,我怎么设置外键?

ID SELECT_TYPE表型possible_keys键key_len REF行额外

1 SIMPLE UA ALL NULL NULL NULL NULL 14使用临时;使用文件排序

1 SIMPLE重新ALL NULL NULL NULL NULL 50使用其中;使用加入缓冲区

1 SIMPLE sp ALL NULL NULL NULL NULL 84使用where;使用加入缓冲区

1 SIMPLE sh ALL NULL NULL NULL NULL 126使用where;使用连接缓冲

1 SIMPLE小号eq_ref PRIMARY PRIMARY 4 web106-prestwick.ua.staff_id 1名

编辑3:谢谢LC,这是我的外键,它们没有设置正确。问题分类

+2

为什么所有的连接?您的选择陈述仅引用员工和可靠性表。 – OTTA

+0

你在sql中究竟想要什么?你可以给我们的表格结构,也许我们可以削减连接。 –

+0

MAX_JOIN_SIZE是一个MYSQL设置,它限制了您的连接语句可以返回的记录数。这可能是由您的共享主机提供商出于各种原因而设置的。 http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_join_size –

回答

0

根据你使用的优化可能与子查询更快或不分贝。

有可能是您的查询2周的瓶颈:

  • 尝试删除您的查询的平均计算功能。如果您的查询速度加快,请尝试用子查询替换它并查看会发生什么。

  • 的多个连接通常会降低性能,并没有什么,你可以修改,除了你的数据库架构做。最简单的解决方案是有一个预先计算数据并减少数据库引擎工作的表。这个表格可以通过修改隐含表格上的数据时触发的存储过程来实现,或者也可以修改php应用程序中的表格值。

1

也许你应该在表上使用更多和/或更好的索引。