0

やあ。このmysql selectステートメントのwhere条件を単純化できる人はいますか? 結果が表示されるまでに時間がかかるか、SET SQL_BIG_SELECTS=1を要求します。

以下のクエリでは:

郵便番号には、BH12SW10などの値が含まれています。

*req_area* には、ケンジントンやチェルシー、SW10 などのデータが含まれています。

地域には、ケンジントンやチェルシーのような値があります。

*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`;

前もって感謝します。

4

1 に答える 1

1

これが非常に遅い理由は、コードが 2 つのテーブルの外積全体に対して 3 つの正規表現を評価する必要があるためです。正規表現は遅く、一致する行を見つけるためにテーブル全体を通過しなければならないものも同様にかなり遅くなります。指定したクエリの正確なセマンティクスを保持しながらできることはほとんどありません。

したがって、そのクエリを改善する方法を尋ねるのではなく、何を達成しようとしているのかを説明し、それをより良い方法でモデル化する方法を見つけたほうがよい場合があります。全文検索インデックスが役立つ場合があります。列を単語に分割し、それらの単語を追加のテーブルに格納すると役立つ場合があります。あなたの質問を編集する方が良いのか、それともこの質問をそのままにして、まったく新しい質問をする方が良いのかわかりません。

req_areaまた、一致が予想される場合にどのように見えるかの例も示す必要があります。req_areaフィールドは常に正規表現に含まれているため、例の他の値のいずれにも「Kensington and Chelsea, SW10」のこの長さが完全に含まれていないため、この例では一致が得られませreq_areaん。sqlfiddleを使用していくつかの実際の例を提供すると、他のユーザーが考えられるクエリを簡単に試すことができるため、受け取る回答の品質 (クエリが実際にチェックされているため) と、まったく回答を受け取る可能性 (人々ができるため) の両方が向上します。先に進み、実験を通じて答えを導き出してください)。

于 2012-08-09T14:31:22.227 に答える