如何从Doctrine QueryBuilder优化此MySQL查询?
此查询由doctrine2 QueryBuilder生成(concat函数只需要2个参数),耗时4秒如何从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, ' '),
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))