WHERE vs HAVING带有多个IF / LIKE的计算字段

时间:2017-05-07 01:52:38

标签: mysql performance optimization having-clause

如果我在使用时没有错,则在没有任何过滤器的情况下执行查询,然后代码将覆盖所有结果以应用过滤器。但在这种情况下,我使用多个Like // If来计算我的订单。我想知道之间会有什么好处:

     Date  SN                  0
0  9/1/16  30  (728-13, 0, 0, 3)
1  9/1/16  32     (360, 0, 1, 4)
2  9/1/16  35     (718, 0, 0, 1)
3  9/1/16  38  (728-13, 0, 0, 2)

SELECT Page.*, 

if  (`flags` LIKE CONCAT('%',?,'%'),

    if  (`title` LIKE CONCAT('%',?,'%'),
        5,
        3
    ),

    if  (`title` LIKE CONCAT('%',?,'%'),
        2,
        0
    ),
) as pageOrder

FROM Page

WHERE `flags` LIKE CONCAT('%',?,'%') OR `title` LIKE CONCAT('%',?,'%')

ORDER BY pageOrder DESC

使用mysql 5.7和php 7.1

1 个答案:

答案 0 :(得分:1)

这个的情况下,没有太大区别。这是一个分析。

  • 由于WHEREORDER BY无法使用任何索引,因此将扫描整个表格(适用于任何一种表格)。

  • 表达式通常只是整个查询的一小部分,因此通常我会忽略LIKEs。但是,在这种情况下,每行LIKEsLIKEsWHERE方法的WHERE大约是Page的两倍,因此可能会慢一点。

  • 一个可以认为 3 * (`flags` LIKE CONCAT('%',?,'%') + 2 * (`title` LIKE CONCAT('%',?,'%') 更具可读性。

  • print txt_again.read()的所有列(大多数行)都将被铲入tmp表中。但我不认为这两种方法有很大的不同。此外,我不一定能找到避免这个问题的方法。

这是一种稍微更紧凑但不快的方式来制定pageOrder表达式:

An unhandled exception occcured.