如何在慢速加载的MySQL查询中发现问题

时间:2019-07-16 08:56:29

标签: php mysql codeigniter

我的页面加载太慢。因此我通过打开慢查询日志记录了慢查询。 它只显示了一个查询,该查询耗时10秒。.而且我在该查询中没有发现任何错误。 谁能建议我该怎么办? 据我所知,查询中编写的所有内容都是必需的。

我只是在这里发布SQL查询。但是PHP代码与许多“ where条件”有所不同,请让我知道是否也有必要。

请查看是否有人可以提供帮助

查询日志->

#查询时间:10.729023锁定时间:0.302145发送的行数:20已检查的行数:162426    #Rows_affected:0

SQL查询->

SELECT
po.type,
po.ecom_order_id,
po.ecom_order_num,
po.seller_id,
po.customer_id,
po.store_id,
po.product_id,
p.product_name,
p.product_sku,
p.mtn_code,
p.cost_price,
po.size_id,
po.color_id,
c.color_name,
po.quantity,
po.price,
u.first_name,
u.last_name,
ua.first_name as modi_fname,
ua.last_name as modi_lname,
po.dfrom_store,
st.store_name as dfrom_storename,
date_format(po.created_on, " % d -% b -% Y") cret_on,
date_format(po.modified_on, " % d -% b -% Y") modi_on,
date_format(po.order_date, " % d -% b -% Y") order_date,
date_format(po.ship_date, " % d -% b -% Y") ship_date,
date_format(po.payment_date, " % d -% b -% Y") payment_date,
date_format(po.delivered_date, " % d -% b -% Y") delivered_date,
date_format(po.manifest_date, " % d -% b -% Y") manifest_date,
cu.customer_name,
cu.mobile,
cu.address,
cu.city,
cu.email_id,
ctp.display_label as size,
es.seller_name,
po.tracking_no,
po.logistics_amt,
po.payment_status,
ctpl.display_label as order_status,
po.status,
po.order_note,
es.image as seller_logo,
es.seller_margin,
es.other_fee,
po.seller_margin as ecom_seller_margin,
po.seller_other_fee,
po.prod_cost_price,
po.is_approved,
ub.first_name as ap_fname,
ub.last_name as ap_lname,
po.payment_received,
po.logistics_provider,
po.gst_tax,
po.gross_margin,
po.gross_percent 
FROM
(
    ecom_orders po
)
LEFT JOIN
    e_sellers es 
    ON es.seller_id = po.seller_id 
LEFT JOIN
    product p 
    ON p.id = po.product_id 
LEFT JOIN
    colors c 
    ON c.color_id = po.color_id 
LEFT JOIN
    master_config ctp 
    ON ctp.value2 = po.size_id 
    AND ctp.key = 'product_size' 
LEFT JOIN
    master_config ctpl 
    ON ctpl.value2 = po.status 
    AND ctpl.key = 'ecom_order_status' 
LEFT JOIN
    user u 
    ON u.userid = po.created_by 
LEFT JOIN
    user ua 
    ON ua.userid = po.modified_by 
LEFT JOIN
    user ub 
    ON ub.userid = po.approved_by 
LEFT JOIN
    customers cu 
    ON cu.cust_id = po.customer_id 
LEFT JOIN
    stores st 
    ON st.id = po.dfrom_store 
WHERE
`po`.`is_deleted` = 'N' 
AND `po`.`store_id` = '2' 
ORDER BY
po.modified_on desc LIMIT 20;

说明:

enter image description here

更新-> 创建的索引。现在行数减少了..

CREATE INDEX idx_ecom

打开电子订单(store_id,is_deleted,modified_on);

如果我索引键和value2,我应该使用复合索引还是分别索引它们?关键字段包含文本,而value2包含int,所以我必须使用FULLTEXT索引吗?

我也发现这写在某处->

  

对数据的任何修改都会更新索引,所以可以,添加   更多索引可能导致INSERT / UPDATE性能下降。如果   索引没有更新,您将获得不同的信息   取决于优化程序是否决定在   索引或原始表

是这样吗?

您建议我索引的表非常活跃,每天要插入和更新1000多个行? 我如何避免性能下降的情况。

更新2-> 我已经更新了索引..并且加载速度非常快..但是在时间日志中,同一页面的另一个查询显示了延迟。 我用EXPLAIN检查了它-引用中为null,但显示了我在上面设置的索引值。 为什么取空值?如何解决这个问题?

更新3->

在一个在线查询优化网站上。我得到了这个结果。

ALTER TABLE `colors` ADD INDEX `colors_idx_id` (`color_id`);
ALTER TABLE `customers` ADD INDEX `customers_idx_id` (`cust_id`);
ALTER TABLE `e_sellers` ADD INDEX `e_sellers_idx_id` (`seller_id`);
ALTER TABLE `ecom_orders` ADD INDEX `ecom_orders_idx_deleted_on` (`is_deleted`,`modified_on`);
ALTER TABLE `ecom_orders` ADD INDEX `ecom_orders_idx_on` (`modified_on`);
ALTER TABLE `master_config` ADD INDEX `master_config_idx_key_value2` (`key`,`value2`);
ALTER TABLE `product` ADD INDEX `product_idx_id` (`id`);
ALTER TABLE `stores` ADD INDEX `stores_idx_id` (`id`);
ALTER TABLE `user` ADD INDEX `user_idx_userid` (`userid`);

这好吗?我现在可以在较早建立的索引上使用它吗?还是首先我应该删除先前创建的索引?

1 个答案:

答案 0 :(得分:1)

基于对EXPLAIN OUTPUT的观察:

  • ctp没有索引
  • ctpl没有索引
  • “ ALL”类型等同于完整扫描,因此记录的获取速度很慢。
  • 您的表po没有索引,您正在[WHERE]上执行条件,说明应该显示出来。没有索引,意味着查询缓慢。在 已删除 store_id
  • 上添加索引
`po`.`is_deleted` = 'N' 
AND `po`.`store_id` = '2' 

  • 不要忘记在 modified_on 列上添加索引

ROWS 表示从生成的索引的基数。数字越小越好