php - MySQL 查询在 phpMyAdmin 中运行正常,但在 PHP 中挂起

标签 php mysql phpmyadmin cpu-usage freeze

我有一个相当简单的查询,当我在 phpMyAdmin 中测试它时运行正常:

   SELECT   
        c.customers_id,
        c.customers_cid,
        c.customers_gender,
        c.customers_firstname,
        c.customers_lastname,
        c.customers_email_address,
        c.customers_telephone,
        c.customers_date_added,
        ab.entry_company,
        ab.entry_street_address,
        ab.entry_postcode, 
        ab.entry_city,
        COUNT(o.customers_id) AS orders_number,
        SUM(ot.value) AS totalvalue, 
        mb.bonus_points
   FROM     
        orders AS o,
        orders_total AS ot,
        customers AS c, 
        address_book AS ab, 
        module_bonus AS mb
   WHERE 
        c.customers_id = o.customers_id 
        AND c.customers_default_address_id = ab.address_book_id 
        AND c.customers_id = mb.customers_id    
        AND o.orders_id = ot.orders_id 
        AND ot.class = 'ot_subtotal'    
 **  AND c.customers_gender  = 'm' AND c.customers_lastname LIKE 'Famlex'
    GROUP BY o.customers_id

标有 ** 的行根据进行查询的应用程序的过滤设置而变化。

现在,当我在 phpMyAdmin 中对此进行测试时,查询需要几秒钟才能运行(这很好,因为有数千个条目,而且据我所知,使用 COUNT 和 SUM 索引时没有帮助) 并且结果是完美的,但是当我在 PHP 中运行完全相同的查询时(在运行前回显),MySQL 线程将核心加载到 100%,并且在我杀死它之前不会停止。

如果我去除额外的东西来计算 COUNT 和 SUM,查询完成但结果对我来说毫无用处。

解释:

1   SIMPLE  mb  ALL     NULL                        NULL        NULL        NULL                                48713       Using temporary; Using filesort
1   SIMPLE  ot  ALL     idx_orders_total_orders_id  NULL        NULL        NULL                                811725      Using where
1   SIMPLE  o   eq_ref  PRIMARY                     PRIMARY     4           db.ot.orders_id                     1           Using where
1   SIMPLE  c   eq_ref  PRIMARY                     PRIMARY     4           db.o.customers_id                   1           Using where
1   SIMPLE  ab  eq_ref  PRIMARY                     PRIMARY     4           db.c.customers_default_address_id   1

在应用索引和使用连接后解释:

1   SIMPLE  c   ref     PRIMARY,search_str_idx              search_str_idx          98      const                                   1       Using where; Using temporary; Using filesort
1   SIMPLE  mb  ALL     NULL                                NULL                    NULL    NULL                                    48713   Using where
1   SIMPLE  ab  eq_ref  PRIMARY                             PRIMARY                 4       db.c.customers_default_address_id       1    
1   SIMPLE  ot  ref     idx_orders_total_orders_id,class    class                   98      const                                   157004  Using where
1   SIMPLE  o   eq_ref  PRIMARY                             PRIMARY                 4       db.ot.orders_id                         1       Using where

最佳答案

使用显式连接而不是隐式连接

SELECT  
c.customers_id,
c.customers_cid,
c.customers_gender,
c.customers_firstname,
c.customers_lastname,
c.customers_email_address,
c.customers_telephone,
c.customers_date_added,
ab.entry_company,
ab.entry_street_address,
ab.entry_postcode, 
ab.entry_city,
COUNT(o.customers_id) AS orders_number,
SUM(ot.value) AS totalvalue, 
mb.bonus_points
FROM    
orders o 
join orders_total ot on o.orders_id = ot.orders_id 
join customers c on c.customers_id = o.customers_id 
join address_book ab on c.customers_default_address_id = ab.address_book_id 
join module_bonus mb on c.customers_id = mb.customers_id 
where
ot.class = 'ot_subtotal'
c.customers_gender  = 'm' 
AND c.customers_lastname = 'Famlex'
GROUP BY o.customers_id

假设所有连接键也是这些表的主键,即:

o.orders_id, c.customers_id, ab.address_book_id 

如果尚未添加以下索引,则需要添加它们

alter table  orders add index customers_id_idx(customers_id);
alter table module_bonus add index customers_id_idx(customers_id);
alter table orders_total add index orders_id_idx(orders_id);
alter table orders_total add index orders_class_idx(class);
alter table customers add index search_str_idx(customers_gender,customers_lastname);

确保在应用索引之前对表进行备份。

关于php - MySQL 查询在 phpMyAdmin 中运行正常,但在 PHP 中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526739/

相关文章:

php - 类似于 使用 facebook 登录

mysql - sql返回最普遍的列值

找不到 phpmyadmin 主机!

javascript - php - javascript - ajax 中的特殊字符

php - 如何在 PhpStorm 的新行中重新格式化代码关联数组?

php - 更改奏鸣曲管理顶部栏的文本

php - 如何创建一个表单,将条目添加到数据库并通过电子邮件发送指向该条目的链接

mysql - 跨多个表的复杂查询

mysql - 将 'schema.sql' 文件导入 PHPMyAdmin

mysql - 使用另一个表中的相应数据更新所有表记录