Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在from中使用子查询优化SQL_Mysql_Sql_Sql Optimization - Fatal编程技术网

Mysql 在from中使用子查询优化SQL

Mysql 在from中使用子查询优化SQL,mysql,sql,sql-optimization,Mysql,Sql,Sql Optimization,我想优化一个SQL语句,下面是原始语句 SELECT DISTINCT p.productID, p.filename, p.model, p.code, p.manufacturerID, f2.manufacturerName, m.manufacturerName, CONCAT('INSERT INTO distribItems(productID, manufacturer, code, distributorText)

我想优化一个SQL语句,下面是原始语句

SELECT DISTINCT
    p.productID,
    p.filename,
    p.model,
    p.code,
    p.manufacturerID,
    f2.manufacturerName,
    m.manufacturerName,
    CONCAT('INSERT INTO distribItems(productID, manufacturer, code, distributorText) VALUES (',
            CAST(p.productID AS CHAR),
            ', \'',
            f2.manufacturerName,
            '\', \'',
            f2.code,
            '\', \'',
            f2.denumire,
            '\') ;') INS
FROM
    (SELECT 
        f.manufacturerName, f.categoryName, f.code, f.denumire, f.code_2
    FROM
        furnizorlist f
    LEFT JOIN distribitems d ON 
        (d.manufacturer = f.manufacturerName
        AND (d.code = f.code OR d.manufacturer LIKE 'DELL')
        AND d.distributorText = LEFT(f.denumire, 450))
    WHERE
        productID IS NULL) f2,
    products p,
    manufacturers m
WHERE
    f2.code_2 <> ''
        AND (f2.code_2 = p.code_2 OR f2.code_2 = p.model_2)
        AND p.manufacturerID = m.manufacturerID
        AND m.manufacturerName = f2.manufacturerName
        AND m.manufacturerName != 'Compatibil'
        AND p.code != '1'
ORDER by p.filename ASC;    
备注:内连接,非左连接

编辑2: 表:furnizorlist 42751条记录
Table:distribitems 72290记录

不完全确定,但这里有几点很有帮助,如果您要使用内部表(您是第一个示例),您确实必须尝试缩小它的范围。这可能意味着写一些多余的where子句。例如,“where order_dt介于2001和2002之间”可能会出现在较小的内部表和主查询中。为什么?因为在某些情况下无法优化内部表-导致服务器临时检索数百万行,而您只需要检索少数行

另外,我注意到一个连接中有一个字符串函数“LEFT(f.denumire,450))”


在连接过程中应避免使用任何类型的函数,这会迫使服务器(逐个)评估每个记录。。它无法优化。这与为什么应该始终使用主键进行连接的原因大致相同,但更耗时。。最好使用“like”=和,不,或,IN。。等等。

1)您将
左连接修改为
内部连接
2)第一个sql是否收到相同的消息?现在两个sql都有空结果,所以是:)-但没有观察到左连接的重要性,感谢子查询中的23087条记录作为左连接,0作为内部连接。。。这就是为什么这么快的原因?:)从那里来的是不可能的地方(解释)谢谢,我将尝试它下午
SELECT DISTINCT
    p.productID,
    p.filename,
    p.model,
    p.code,
    p.manufacturerID,
    f.manufacturerName,
    m.manufacturerName,
    CONCAT('INSERT INTO distribItems(productID, manufacturer, code, distributorText) VALUES (',
            CAST(p.productID AS CHAR),
            ', \'',
            f.manufacturerName,
            '\', \'',
            f.code,
            '\', \'',
            f.denumire,
            '\') ;') INS
FROM
    furnizorlist f,
    distribitems d,
#subquery end
    products p,
    manufacturers m
WHERE
    d.manufacturer = f.manufacturerName
        AND (d.code = f.code OR d.manufacturer LIKE 'DELL')
        AND d.distributorText = LEFT(f.denumire, 450)
        AND d.productID IS NULL
#subquery condions end (f and d tables)
# the next is a subquery result:
        AND f.code_2 <> ''
        AND (f.code_2 = p.code_2 OR f.code_2 = p.model_2)
        AND p.manufacturerID = m.manufacturerID
        AND m.manufacturerName = f.manufacturerName
        AND m.manufacturerName != 'Compatibil'
        AND p.code != '1'
ORDER by p.filename ASC;    
EXPLAIN 

SELECT 
    f.manufacturerName,
    f.categoryName,
    f.code,
    f.denumire,
    f.code_2
FROM
    furnizorlist f
        INNER JOIN
    distribitems d ON (d.manufacturer = f.manufacturerName
        AND (d.code = f.code
        OR d.manufacturer LIKE 'DELL')
        AND d.distributorText = LEFT(f.denumire, 450))
WHERE
    productID IS NULL