Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie w serwisie aukcyjnym
Forum PHP.pl > Forum > PHP
www.aukcje.fm
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?
phpion
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).
www.aukcje.fm
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.  


bim2
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ć.
Fifi209
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 ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.