Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyszukiwanie w serwisie aukcyjnym, LEFT OUTER JOIN
www.aukcje.fm
post
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


Witam,

Mamy problem z wydajnością wyszukiwania pełnotekstowego w serwisie aukcyjnym AUKCJE FM - ponad 700 000 rekordów aukcji.

Użyto funkcji match against + LEFT OUTER JOIN

Jak można zoptymalizować wyszukiwanie?

Oto kod
  1. $qs ="select count(*) as total FROM AUKCJE_auctions au
  2. LEFT OUTER JOIN AUKCJE_itemvariants iv
  3. ON au.id=iv.id
  4. WHERE ( au.suspended='0')
  5. AND ($wher au.private='n' $ora)
  6. AND $varq
  7. AND au.starts<=".$NOW."
  8. ORDER BY $sort";
  9.  
  10.  
  11. $rsl = mysql_query ($qs);
  12. if($rsl) {
  13. $hash = mysql_fetch_array($rsl);
  14. $total = (int)$hash[0];
  15. } else { $total = 0; echo mysql_error(); }
  16.  
  17. $TOTALAUCTIONS = $total;
  18. if(!isset($PAGE) || $PAGE == 1) {
  19. $OFFSET = 0;
  20. $PAGE = 1;
  21. } else {
  22. $OFFSET = ( $PAGE - 1) * $limit_aukcji;
  23. }
  24. $PAGES = ceil($TOTALAUCTIONS / $limit_aukcji);
  25.  
  26. $qs ="select au.* FROM AUKCJE_auctions au
  27. LEFT OUTER JOIN AUKCJE_itemvariants iv
  28. ON au.id=iv.id
  29. WHERE ( au.suspended='0')
  30. AND ($wher au.private='n' $ora)
  31. AND $varq
  32. AND au.starts<=".$NOW."
  33. ORDER BY $sort LIMIT ".intval($OFFSET).",".intval($limit_aukcji);
  34.  
  35.  
  36.  
  37. $result = mysql_query ($qs);
  38. if(!isset($_SESSION["PHPAUCTION_LOGGED_IN"]) && (($location_radio=='3') || ($location_radio=='4'))) {
  39. $ERR = $text_574;
  40. } elseif($title == '') {
  41. $ERR = $text_660;
  42. } else {
  43. if(@mysql_num_rows($result) > 0) {
  44. include $include_path."browseitems.inc.php";
  45. $TPL_auctions_list_value=browseItems($result);
  46. $auctions_count=count($TPL_auctions_list_value);
  47.  
  48. $TPL_auctions_total_value .="";
  49. if ($auctions_count==0) {
  50. $TPL_auctions_total_value = ""."$ERR_114";
  51. }
  52.  
  53. foreach ($states as $key=>$val) {
  54. $TPL_states_list.= " <OPTION VALUE='$val'";
  55. if($val==$state && $val != '') {
  56. $TPL_states_list.= " SELECTED='true'";
  57. }
  58. $TPL_states_list.= " >".$val."</OPTION>\n";
  59. }
  60.  



nikt nie ma pomysłu?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




W Twoim kodzie nigdzie nie ma wyszukiwania pełnotekstowego. Jeśli znajduje się ono w $wher lub $varq to spróbuj przenieść to wyrażenie jako pierwszy warunek w wyszukiwaniu. Możesz również wkleić nam wynik EXPLAIN (czyli poprzedź wyszukiwanie słowem EXPLAIN).
Go to the top of the page
+Quote Post
www.aukcje.fm
post
Post #3





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 4.05.2010

Ostrzeżenie: (20%)
X----


Fakt, nie podałem dalszego kodu:


  1. $varq.=")";
  2.  
  3. $title=iconv('utf-8',"iso-8859-2",$title);
  4.  
  5. if (($title ) && $_GET['go']!="ZnajdĽ wszystkie >") { //WHERE MATCH (Tytul,Tresc) AGAINST(?szukane słowo?)
  6.  
  7. $title2=split(" ", $title);
  8. $wher .= "(";
  9.  
  10. if(isset($_REQUEST['desc'])) {
  11. $wher .= "(MATCH(au.title, au.description) AGAINST('".addslashes(implode(',', $title2))."')) ";
  12. } else {
  13. $wher .= "(MATCH(au.title) AGAINST('".addslashes(implode(',', $title2))."')) ";
  14. }
  15. $wher .= " OR au.id=".intval($title).") AND ";
  16. }
  17.  
  18. /*
  19. if (($title ) && $_GET['go']!="ZnajdĽ wszystkie >") { //WHERE MATCH (Tytul,Tresc) AGAINST(?szukane słowo?)
  20.  
  21.   //if ($desc) $wher .= "((au.description like '%".addslashes($title)."%') ";
  22.  
  23.   $title2=split(" ", $title);
  24.  
  25.   for($i=0, $is=count($title2); $i<$is; $i++){
  26.   if(strlen($title2[$i])>0){
  27.   if($i){
  28.   $title3.=" OR ";
  29.   $title4.=" OR ";
  30.   }
  31.   $title3.="au.title like '%".$title2[$i]."%'";
  32.   $title4.="au.description like '%".$title2[$i]."%'";
  33.   }
  34.   }
  35.  


Go to the top of the page
+Quote Post
bim2
post
Post #4





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Rozbicie w każdej aukcji wyrazów w tytule i tekscie oraz wrzucenie ich do nowej tabeli np
ID_AUKCJI | WYRAZ (lower) | TYPE

Wyraz musi być trim() i strtolower() a w TYPE trzymany byłby typ (1-title, 2-text).

Wtedy proste WHERE IN powinno być w miarę szybko, a ty jako zwrot z bazy dostaniesz ID aukcji. I z tych ID pobierzesz reszte danych.

Pamiętaj tylko, że przy dodawaniu nowej aukcji albo jej edycji musisz uwzględniać nowe słowa kluczowe. A przy kasowaniu starych aukcji, należy je kasować.
Go to the top of the page
+Quote Post
Fifi209
post
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(bim2 @ 26.05.2011, 17:21:36 ) *
A przy kasowaniu starych aukcji, należy je kasować.

To już raczej relacje powinny załatwić.

@topic
Dlaczego nie zastosujesz się do postu phpion ?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 11:13