我的查询是
select OldCreatorProduct.promekars_madeid, OldCreatorProduct.productIdType, OldCreatorProduct.mekarsId, oldCreatorMaster.mekarsId, OldCreatorProduct.productName,
LEFT(OldCreatorProduct.promekarDescription, 150) AS 'Short Desc', OldCreatorProduct.promekarDescription, OldCreatorProduct.productMekarPrice, OldCreatorProduct.productAddDateM, oldCategoryMaster.productId
from beta_icustommadeit.productmekarinfo AS OldCreatorProduct
INNER JOIN beta_icustommadeit.productmaster oldCategoryMaster ON OldCreatorProduct.productIdType=oldCategoryMaster.productId
INNER JOIN beta_icustommadeit.managemekars oldCreatorMaster ON OldCreatorProduct.mekarsId=oldCreatorMaster.mekarsId
INNER JOIN icmi_db.users nk on oldCreatorMaster.mekarsEmail = nk.email_id
答案 0 :(得分:1)
在查询上运行EXPLAIN
以查看执行计划,并验证查询是否使用了合适的索引。
验证连接谓词是否在正确的列上。 (连接的规范模式是从外键列到主键...没有足够的信息让我们知道是否已经完成。)
考虑在WHERE
子句中添加其他谓词,以减少查询需要执行的工作量,如果有些行不需要返回。
icmi_db.users
未返回任何列。 (连接到该表的目的只是为了消除mekarsEmail
不匹配的行?)
无法通过此查询判断您要尝试实现的目标。
要诊断性能问题,请使用 EXPLAIN
查看执行计划。
8.8.1 Optimizing Queries with EXPLAIN https://dev.mysql.com/doc/refman/5.5/en/using-explain.html
确保您有合适的索引。
并验证查询是否真的会返回您需要的结果。
其他一些说明:
我们注意到查询返回了两个同名mekarsId
的列,可能您想给其中一个别名。
使用反引号字符而不是单引号括起/转义标识符。
就个人而言,我会重新格式化查询以使查询更易于理解,并使EXPLAIN
输出更容易使用(更短的表别名)。
SELECT ocp.promekars_madeid
, ocp.productIdType
, ocp.mekarsId
, ocr.mekarsId AS `ocr_mekarsId`
, ocp.productName
, LEFT(ocp.promekarDescription,150) AS `Short Desc`
, ocp.promekarDescription
, ocp.productMekarPrice
, ocp.productAddDateM
, ocm.productId
FROM beta_icustommadeit.productmekarinfo ocp
JOIN beta_icustommadeit.productmaster ocm
ON ocm.productId = ocp.productIdType
JOIN beta_icustommadeit.managemekars ocr
ON ocr.mekarsId = ocp.mekarsId
JOIN icmi_db.users nk
ON nk.email_id = ocr.mekarsEmail