Php mysql卡在内部连接查询中

Php mysql卡在内部连接查询中,php,mysql,database-administration,mysql5,Php,Mysql,Database Administration,Mysql5,我有一个mysql数据库,大约有200个表&每个表大约有40000个条目。 我正在尝试内部连接,但在xamp环境中,大约需要4hr。。。就像在云端一样,10分钟后它只会给出错误500。 这是一个问题 SELECT DISTINCT od.io_id, od.io_date, sm.style_code, cm.short_name, od.cust_po, od.mepl_no, od.season, btm.cat_art_no, odd.rev_del_date, od.total_qty,

我有一个mysql数据库,大约有200个表&每个表大约有40000个条目。 我正在尝试内部连接,但在xamp环境中,大约需要4hr。。。就像在云端一样,10分钟后它只会给出错误500。 这是一个问题

SELECT DISTINCT od.io_id, od.io_date, sm.style_code, cm.short_name, od.cust_po, od.mepl_no, od.season, btm.cat_art_no, odd.rev_del_date, od.total_qty, od.shipping_qty, um.short_name, od.order_value_fc, od.order_value_inr, odd.ex_factory_date, od.repeat_order, ot.order_type_name, od.agent_commission AS return_bonus, cm.bonus_discount, cm.other_discount, od.status, il.short_name AS terms, delm.delivery_mode_name, c.short_name AS cur
FROM orderdetails od
INNER JOIN bomtrimqty btm ON od.style_id = btm.style_id
INNER JOIN orderdeliverydetails odd ON od.io_no = odd.io_no
INNER JOIN ordertype ot ON od.order_type_id = ot.order_type_id
INNER JOIN stylemaster sm ON od.style_id = sm.style_id
INNER JOIN customermaster cm ON od.customer = cm.customer_id
INNER JOIN unitmaster um ON um.unit_id = sm.unit_id
INNER JOIN deliverymodelist delm ON delm.delivery_mode_id = odd.rev_del_mode
INNER JOIN incotermlist il ON il.inco_term_id = od.order_type_id
INNER JOIN currency c ON od.fc_unit = c.currency_id
ORDER BY od.io_id DESC
我也试过了

GROUP BY od.io_id DESC
LIMIT 10
但是没有运气。。。。mysql没有给出任何错误。。 请帮我解决这个问题


提前谢谢

首先,您可以添加一些索引:

ALTER TABLE orderdetails ADD INDEX abc (customer, style_id, io_no, order_type_id, fc_unit);
ALTER TABLE bomtrimqty ADD INDEX abc (style_id);
ALTER TABLE orderdeliverydetails ADD INDEX abc (io_no, rev_del_mode);
ALTER TABLE ordertype ADD INDEX abc (order_type_id);
ALTER TABLE stylemaster ADD INDEX abc (style_id, unit_id);
ALTER TABLE customermaster ADD INDEX abc (customer_id);
ALTER TABLE unitmaster ADD INDEX abc (unit_id);
ALTER TABLE deliverymodelist ADD INDEX abc (delivery_mode_id);
ALTER TABLE incotermlist ADD INDEX abc (inco_term_id);
ALTER TABLE currency ADD INDEX abc (currency_id);
然后可以更改联接顺序:

SELECT 
DISTINCT 
  od.io_id, od.io_date, sm.style_code, cm.short_name, od.cust_po, od.mepl_no, od.season, btm.cat_art_no, odd.rev_del_date, od.total_qty, od.shipping_qty, 
  um.short_name, od.order_value_fc, od.order_value_inr, odd.ex_factory_date, od.repeat_order, ot.order_type_name, od.agent_commission AS return_bonus, 
  cm.bonus_discount, cm.other_discount, od.status, il.short_name AS terms, delm.delivery_mode_name, c.short_name AS cur
FROM orderdetails od
INNER JOIN customermaster cm ON od.customer = cm.customer_id
INNER JOIN stylemaster sm ON od.style_id = sm.style_id
INNER JOIN unitmaster um ON um.unit_id = sm.unit_id
INNER JOIN bomtrimqty btm ON od.style_id = btm.style_id
INNER JOIN orderdeliverydetails odd ON od.io_no = odd.io_no
INNER JOIN ordertype ot ON od.order_type_id = ot.order_type_id
INNER JOIN deliverymodelist delm ON delm.delivery_mode_id = odd.rev_del_mode
INNER JOIN incotermlist il ON il.inco_term_id = od.order_type_id
INNER JOIN currency c ON od.fc_unit = c.currency_id
ORDER BY od.io_id DESC
;

您现在的表现如何?

首先,您可以添加一些指标:

ALTER TABLE orderdetails ADD INDEX abc (customer, style_id, io_no, order_type_id, fc_unit);
ALTER TABLE bomtrimqty ADD INDEX abc (style_id);
ALTER TABLE orderdeliverydetails ADD INDEX abc (io_no, rev_del_mode);
ALTER TABLE ordertype ADD INDEX abc (order_type_id);
ALTER TABLE stylemaster ADD INDEX abc (style_id, unit_id);
ALTER TABLE customermaster ADD INDEX abc (customer_id);
ALTER TABLE unitmaster ADD INDEX abc (unit_id);
ALTER TABLE deliverymodelist ADD INDEX abc (delivery_mode_id);
ALTER TABLE incotermlist ADD INDEX abc (inco_term_id);
ALTER TABLE currency ADD INDEX abc (currency_id);
然后可以更改联接顺序:

SELECT 
DISTINCT 
  od.io_id, od.io_date, sm.style_code, cm.short_name, od.cust_po, od.mepl_no, od.season, btm.cat_art_no, odd.rev_del_date, od.total_qty, od.shipping_qty, 
  um.short_name, od.order_value_fc, od.order_value_inr, odd.ex_factory_date, od.repeat_order, ot.order_type_name, od.agent_commission AS return_bonus, 
  cm.bonus_discount, cm.other_discount, od.status, il.short_name AS terms, delm.delivery_mode_name, c.short_name AS cur
FROM orderdetails od
INNER JOIN customermaster cm ON od.customer = cm.customer_id
INNER JOIN stylemaster sm ON od.style_id = sm.style_id
INNER JOIN unitmaster um ON um.unit_id = sm.unit_id
INNER JOIN bomtrimqty btm ON od.style_id = btm.style_id
INNER JOIN orderdeliverydetails odd ON od.io_no = odd.io_no
INNER JOIN ordertype ot ON od.order_type_id = ot.order_type_id
INNER JOIN deliverymodelist delm ON delm.delivery_mode_id = odd.rev_del_mode
INNER JOIN incotermlist il ON il.inco_term_id = od.order_type_id
INNER JOIN currency c ON od.fc_unit = c.currency_id
ORDER BY od.io_id DESC
;


您现在的性能如何?

请尝试使用子查询而不是许多联接,并在您将使用的字段上保留索引,在这种情况下,此策略将起作用

请尝试使用子查询而不是多个联接,并在您将在WHERE条件下使用的字段上保留索引,此策略将起作用

您是否在所有要连接的列上都有索引?和orderdetails.io_id上的索引?同意@Barmar-这可能是与某些列缺少索引有关的问题。我建议500错误,因为脚本时间限制。。。检查php错误报告设置以获得更多信息。除了正确的索引之外:我没有看到任何限制您检索内容的因素。使用多个“WHERE”子句,并将结果仅限于实际使用的结果。“分组依据”是不同的,因为它仍然需要所有数据。@AashishPande这将是您的问题。对于每个连接,它都必须执行完整的表扫描。这意味着它必须扫描
40000^10
行。是否对所有要连接的列都有索引?和orderdetails.io_id上的索引?同意@Barmar-这可能是与某些列缺少索引有关的问题。我建议500错误,因为脚本时间限制。。。检查php错误报告设置以获得更多信息。除了正确的索引之外:我没有看到任何限制您检索内容的因素。使用多个“WHERE”子句,并将结果仅限于实际使用的结果。“分组依据”是不同的,因为它仍然需要所有数据。@AashishPande这将是您的问题。对于每个连接,它都必须执行完整的表扫描。这意味着它必须扫描
40000^10
行。表'sorry'中不存在键列'rev_del_mode'。。。ALTER工作正常。。。但加入订单查询耗时5小时,
EXPLAIN SELECT yourQuery
?[link]goo.gl/flPlbA的输出是什么?用于输出建议表单
EXPLAIN SELECT
query result?而ALTER----'错误代码:1072。表'sorry'中不存在键列'rev_del_mode'。。。ALTER工作正常。。。但加入订单查询耗时5小时,
EXPLAIN SELECT yourQuery
的输出是什么?[link]goo.gl/flPlbA用于输出建议表单
EXPLAIN SELECT
查询结果?