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

Php 如何在慢加载MySQL查询中发现问题,php,mysql,codeigniter,Php,Mysql,Codeigniter,我的页面加载太慢了。因此,我通过打开慢速查询日志来记录慢速查询。 它只显示了一个耗时10秒的查询,我看不出这个查询有什么错误。 有人能建议我做什么吗? 就我所知,在查询中编写的所有内容都是必需的 我只是在这里发布SQL查询。但是PHP代码与许多“where条件”有些不同,如果需要,请告诉我 请看是否有人能帮忙 查询日志-> 查询时间:10.729023锁定时间:0.302145行发送:20行检查:162426 受影响的行:0 SQL查询-> SELECT po.type, po.ecom_ord

我的页面加载太慢了。因此,我通过打开慢速查询日志来记录慢速查询。 它只显示了一个耗时10秒的查询,我看不出这个查询有什么错误。 有人能建议我做什么吗? 就我所知,在查询中编写的所有内容都是必需的

我只是在这里发布SQL查询。但是PHP代码与许多“where条件”有些不同,如果需要,请告诉我

请看是否有人能帮忙

查询日志->

查询时间:10.729023锁定时间:0.302145行发送:20行检查:162426 受影响的行: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;
委员会解释说:

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

CREATE INDEX idx_ecom
在ecom订单存储id上,是否删除、修改或打开

如果我索引key和value2,我应该使用复合索引还是单独索引它们?key字段包含文本,value2包含int,所以我是否必须使用全文索引

我还在某处找到了这封信->

索引在对数据进行任何修改时都会得到更新,所以是的,添加 更多索引可能导致插入/更新性能下降。如果 索引没有得到更新,您将得到不同的信息 取决于优化器是否决定在 索引还是原始表

是这样吗

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

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

更新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`);

这个好吗??我现在可以在早期制作的索引上使用它吗?或者首先,我应该根据对解释输出的观察,删除先前创建的索引??

ctp没有索引 ctpl没有索引 类型ALL相当于完全扫描,因此记录的获取速度较慢。 您的表po没有索引,您在[WHERE]上执行了条件,解释应该显示这一点。没有索引,意味着查询速度慢。在上添加索引\u已删除并存储\u id 别忘了在修改后的列上添加索引
行表示从生成的索引中提取的数据的基数。数字越小越好

运行解释。。语句,并查看它是否使用任何索引。你是否在表上定义了索引?@MadhurBhaiya当我在这个语句上运行explain时,它给出了这个->我不知道。。但是我认为它应该在第一列显示索引而不是全部。。这就是你所说的索引??请帮助我如何编制索引?根据解释结果,创建一个复合索引。删除后,在ecom\u orders表上存储\u id,修改\u。此外,添加一个复合索引值2,在master\u config表中键入。此表中的力很强。其工作原理如下?->创建索引ecom\u orders\u ind ON ecom\u orders\u deleted,store\u id,modified\u ON;这就是我如何创建索引的方法?在数据库的所有表中的所有字段上创建索引怎么样?如果它加速。。创建所有字段的索引将是一个很好的实践???@AnshM在创建索引时,可以是单列或多列。将索引视为表的字典。表上的索引太多也会使查询速度变慢,这是一种双重优势。当你建立索引时,要明智地应用索引。。谢谢。所以如果我在tablenamefield1,field5,field6上写下创建索引名;然后运行它。。这会使查询速度加快吗??就这样??我需要在phpmyadmin中运行这一次??或者我必须用eachrun在model_file.php中插入此代码吗?它只声明一次。不需要每次运行都创建索引。
`po`.`is_deleted` = 'N' 
AND `po`.`store_id` = '2'