我的页面加载太慢。因此我通过打开慢查询日志记录了慢查询。 它只显示了一个查询,该查询耗时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;
说明:
更新-> 创建的索引。现在行数减少了..
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`);
这好吗?我现在可以在较早建立的索引上使用它吗?还是首先我应该删除先前创建的索引?
答案 0 :(得分:1)
基于对EXPLAIN OUTPUT的观察:
po
没有索引,您正在[WHERE]上执行条件,说明应该显示出来。没有索引,意味着查询缓慢。在 已删除 和 store_id `po`.`is_deleted` = 'N'
AND `po`.`store_id` = '2'
ROWS 表示从生成的索引的基数。数字越小越好