选择查询比查看快2-3倍

Ric*_*nop 3 mysql sql sql-view

此查询单独运行:

SELECT 
    -- lots of columns 
FROM 
    table1 t1
    LEFT JOIN table2 t2
        ON t2.[userid] = t1.[userid]
    LEFT JOIN table3 t3
        ON t1.[orderid] = t3.[orderid]
    LEFT JOIN table4 t4
        ON t4.[orderitemlicenseid] = t3.[orderitemlicenseid]
    LEFT JOIN table5 t5
        ON t1.[orderid] = t5.[orderid]
    LEFT JOIN table6 t6
        ON t5.[transactionid] = t6.[transactionid]
    LEFT JOIN table7 t7
        ON t7.[transactionid] = t5.[transactionid]
    LEFT JOIN table8 t8
        ON t8.[voucherid] = t7.[voucherid]
    LEFT JOIN table9 t9
        ON t8.[voucherid] = t9.[voucherid]
    LEFT JOIN table10 t10
        ON t10.[vouchergroupid] = t9.[vouchergroupid]
        AND t10.[territoryid] = t2.[territoryid]
    LEFT JOIN table11 t11
        ON t11.[voucherid] = t8.[voucherid]
    LEFT JOIN table12 t12
        ON t12.[orderid] = t1.[orderid]
GROUP BY 
    t5.[transactionid]
Run Code Online (Sandbox Code Playgroud)

完成大约需要2.5秒.当我将其保存到视图并将其运行为:

SELECT*FROM viewName;

完成需要7秒钟.

是什么原因以及如何让视图更快?

kev*_*v22 6

在MySql中处理视图的方式存在性能问题.在这里查看这个答案.

基本上,MySql中有两种不同的算法用于视图:Merge和Temptable.合并通常表现相当不错,但Temptable的表现非常差.当视图包含某些构造(包括)时GROUP BY,不能使用合并,因此您的视图将使用Temptable算法.