Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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
如何从Doctrine QueryBuilder优化此MySQL查询?_Mysql_Symfony_Doctrine Orm_Query Optimization_Entity Attribute Value - Fatal编程技术网

如何从Doctrine QueryBuilder优化此MySQL查询?

如何从Doctrine QueryBuilder优化此MySQL查询?,mysql,symfony,doctrine-orm,query-optimization,entity-attribute-value,Mysql,Symfony,Doctrine Orm,Query Optimization,Entity Attribute Value,此查询由doctrine2 QueryBuilder生成(concat函数只需要2个参数),耗时4秒 SELECT COUNT(*) AS dctrn_count FROM ( SELECT DISTINCT id_4 FROM ( SELECT 1 / LOCATE( ?, CONCAT( CONCAT( CONCAT(w0_.firstname, ' '),

此查询由doctrine2 QueryBuilder生成(concat函数只需要2个参数),耗时4秒

SELECT  COUNT(*) AS dctrn_count
    FROM  
    (
        SELECT  DISTINCT id_4
            FROM  
            (
                SELECT  1 / LOCATE( ?, CONCAT( CONCAT( CONCAT(w0_.firstname, ' '),
                                                CONCAT(w0_.lastname, ' ') ), w1_.fullname ) 
                          ) AS sclr_0,
                        1 / LOCATE( ?, CONCAT( CONCAT( CONCAT(w0_.firstname, ' '),
                                                CONCAT(w0_.lastname, ' ') ), w1_.shortname ) 
                          ) AS sclr_1,
                        1 / LOCATE( ?, CONCAT( CONCAT( CONCAT(w0_.nickname, ' '),
                                                CONCAT(w0_.lastname, ' ') ), w1_.fullname ) 
                          ) AS sclr_2,
                        1 / LOCATE( ?, CONCAT( CONCAT( CONCAT(w0_.nickname, ' '),
                                                CONCAT(w0_.lastname, ' ') ), w1_.shortname ) 
                          ) AS sclr_3,
                        w0_.id AS id_4, w0_.slug AS slug_5, w0_.firstname AS firstname_6,
                        w0_.lastname AS lastname_7, w0_.nickname AS nickname_8,
                        w0_.gender AS gender_9, w0_.email AS email_10, w0_.email_checked AS email_checked_11,
                        w0_.title_en AS title_en_12, w0_.short_title AS short_title_13,
          -- lots of stuff removed (see edit) --
                        w5_.biography_en AS biography_en_55, w5_.created AS created_56, w5_.updated AS updated_57, w6_.id AS id_58, w6_.web_text AS web_text_59, w6_.created AS created_60
                    FROM  wmn_executive w0_
                    INNER JOIN  wmn_company w1_  ON w0_.company_id = w1_.id
                    INNER JOIN  wmn_industry w7_  ON w1_.industry_id = w7_.id
                    INNER JOIN  wmn_location w2_  ON w1_.location_id = w2_.id
                    INNER JOIN  wmn_country w3_  ON w2_.country_id = w3_.id
                    INNER JOIN  wmn_city w4_  ON w2_.city_id = w4_.id
                    LEFT JOIN  wmn_executive_link w5_  ON w0_.link_id = w5_.id
                    LEFT JOIN  wmn_web_executive w6_  ON w0_.id = w6_.executive_id
                    WHERE  w0_.original_id IS NULL
                      AND  w0_.user_id IS NOT NULL
                      AND  ( w0_.firstname LIKE ?
                              OR  w0_.lastname LIKE ?
                              OR  w0_.nickname LIKE ?
                              OR  w1_.fullname LIKE ?
                              OR  w1_.shortname LIKE ?
                              OR  w0_.title_en LIKE ?
                              OR  w0_.short_title LIKE ?
                              OR  w7_.industry_name_en LIKE ?
                              OR  w7_.industry_name_fr LIKE ?
                              OR  w3_.country_name_en LIKE ?
                              OR  w3_.country_name_fr LIKE ?
                              OR  w4_.city_name LIKE ? 
                          )
                    ORDER BY  sclr_0 DESC, sclr_1 DESC, sclr_2 DESC, sclr_3 DESC ) dctrn_result 
    ) dctrn_table

**按排序的
对最终结果没有好处;移除它

**

可以简化为

SELECT COUNT(DISTINCT(id_4))
**SELECT子句中的所有项目均未使用,id_4除外;摆脱他们

****这3种优化可能会将运行时间从4.0秒缩短到3.9秒

然后你会说这不是真正的疑问,只是一个计数


如果要进行这样的凌乱文本扫描,则需要将所有这些字符串放在一个表中。更好的是,所有字符串都连接到一个表中的一列中。这只是为了搜索,而不是为了显示。然后在该列上建立一个
全文索引。这将解决
等“%”问题。但我不知道如何将其重新纳入doctrine2。

您不需要嵌套
concat
s;它可以包含两个以上的参数;不是说它有助于提高性能,但它会大大提高可读性。您考虑过吗?谢谢您的回复。很遗憾,是的,我必须嵌套concat,因为我的doctrine2查询生成器的concat函数只需要2个参数:(我忘了指出查询是由QueryBuilder生成的哦,刚刚找到了我自己问题的第一个解决方案,因为QueryBuilder的concat只需要2个参数,我只需要避免使用这个函数,并使用一些DQL在SQL中生成我自己的concat,其中包含许多我想要的参数!)谢谢@uuerdo还在等待任何其他性能提示;-)
SELECT COUNT(DISTINCT(id_4))