您好。任何人都可以简化这个mysql select语句的where条件吗?结果需要很长时间,或者要求 SET SQL_BIG_SELECTS = 1 。
在下面的查询中:
邮政编码包含 BH12 或 SW10 等值,
* req_area *包含 Kensington和Chelsea,SW10 等数据,
区域的值类似于 Kensington和Chelsea ,
* town_area *的值类似于 West Brompton,Chelsea 。
select `a`.`user_id` AS `user_id`,`a`.`req_area` AS `req_area`,`a`.`req_area2` AS `req_area2`,`a`.`req_area3` AS `req_area3`,
`a`.`req_property_type` AS `req_property_type`,`a`.`req_bedrooms` AS `req_bedrooms`,`b`.`latitude` AS `latitude`,
`b`.`longitude` AS `longitude`,`b`.`postcode` AS `postcode`
from (`cff_user_property_req_view` `a` join `cff_uk_short_postcodes` `b`)
where
(`b`.`postcode` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or
`b`.`region` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or
`b`.`town_area` regexp concat("'",concat('[[:<:]]',`a`.`req_area`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area2`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area3`,'[[:>:]]'),"'")>=1)
order by `a`.`user_id`;
提前致谢。
答案 0 :(得分:1)
之所以这么慢是因为你的代码需要在两个表的整个外部产品上评估三个正则表达式。正则表达式很慢,任何必须通过整个表来查找匹配行的东西都很慢。在保留您提供的查询的确切语义的同时,您几乎无法做到。
因此,您可能更好地描述要实现的内容,而不是寻求改进查询的方法,然后找到一种以更好的方式对其进行建模的方法。全文搜索索引可能有所帮助。将列拆分为单词并将这些单词存储在额外的表中可能会有所帮助。我不确定编辑你的问题是否更好,或者现在就提出这个问题,并提出一个全新的问题。
您可能还应该举例说明在您期望匹配的情况下req_area
应该是什么样子。由于req_area
字段始终包含在正则表达式中,因此您的示例不会产生匹配,因为“Kensington和Chelsea,SW10”的长req_area
未包含在任何你的例子中的其他值。使用sqlfiddle提供一些实际示例可以让其他人更容易地尝试可能的查询,从而提高您收到的答案的质量(因为查询实际已被检查)以及接收任何答案的机会(因为人们可以通过实验继续发展他们的答案。)