Ergebnis 1 bis 3 von 3
  1. #1
    EvilBen ist offline Foren As
    registriert
    30-08-2015
    Beiträge
    98

    Datenbank Suche optimieren

    Hallo Leute,

    ich bin grad an einer Funktion am basteln, die meine Datenbank nach Usern durchsuchen soll. Problem: Sind in etwa 25.000! Dementsprechend lange dauert jetzt die Suche, so wie ich sie aufgebaut habe. Bin kein Profi, deshalb hoffe ich ihr könnt mir helfen das ganze zu optimieren.

    Zum Verständnis:

    Der User kann eben nach verschiedenen Suchkriterien suchen. "Größe, Gewicht, Umkreis zum eigenen Wohnort, Alter usw...." (siehe Code) für die Umkreissuche nutze ich die OpengeoDB, was ganz gut funktioniert! Allem in allem funktioniert das so, nur wird dabei die maximale Ausführungszeit durch die php.ini verhindert, auf die ich keinen Zugriff habe!

    Hier der Code, in der Hoffnung ihr wisst weiter. Ich danke euch im Voraus:

    Code:
    ...
    case "searchuser":
    			
    			$return = "<div class=\"people-nearby\">
    ";
    
    			if($_GET['gender'] == "2"){
    				$gender = "usr_gender = '1' OR usr_gender = '0'";
    			}else{
    				$gender = "usr_gender = '".$_GET['gender']."'";
    			}
    			
    			$umkreis = "SELECT 
        dest.zc_zip, 
        dest.zc_location_name,
        ACOS(
             SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
             + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
             * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
        ) * 6380 AS distance
    FROM zip_coordinates dest
    CROSS JOIN zip_coordinates src
    WHERE src.zc_zip = '".getPlz($_GET['id'])."'
    AND dest.zc_id <> src.zc_id
    HAVING distance <= ".$_GET['umkreis']."
    ORDER BY distance DESC";
    			
    			$ur = $db->query($umkreis);
    			
    			while($u = $ur->fetch_assoc()){
    
    			
    					$sql = "SELECT * FROM sn_users WHERE ".$gender." AND usr_alter >= '".$_GET['alterv']."' AND usr_alter <= '".$_GET['alterb']."' AND usr_plz = '".$u['zc_zip']."' ORDER BY usr_vorname ASC, usr_nachname ASC LIMIT 50";
    			
    					$result = $db->query($sql);
    						while($row = $result->fetch_assoc()){
    								if($_GET['gewichtv'] != "" || $_GET['gewichtb'] != "" || $_GET['groessev'] != "" || $_GET['groesseb'] != "" ){
    									$gewicht = "true";
    									$groesse = "true";
    									
    									$details = "SELECT * FROM sn_users_detais WHERE det_id = '".$row['usr_id']."'";
    									$dr = $db->query($details);
    									$det = $dr->fetch_assoc();
    									
    									if($_GET['gewichtv'] != ""){
    										if($_GET['gewichtv'] >= $det['det_gewicht']){
    											$gewicht = "true";
    										}else{
    											$gewicht = "false";
    										}
    									}
    									
    									if($_GET['gewichtb'] != ""){
    										if($_GET['gewichtb'] <= $det['det_gewicht']){
    											$gewicht = "true";
    										}else{
    											$gewicht = "false";
    										}
    									}
    									
    									if($_GET['groessev'] != ""){
    										if($_GET['groessev'] >= $det['det_groesse']){
    											$groesse = "true";
    										}else{
    											$groesse= "false";
    										}
    									}
    									
    									if($_GET['groesseb'] != ""){
    										if($_GET['groesseb'] <= $det['det_groesse']){
    											$groesse = "true";
    										}else{
    											$groesse = "false";
    										}
    									}
    									
    									if($groesse == "true" && $gewicht == "true"){
    										
    										$return .= 	"<div class=\"nearby-user\">
                    <div class=\"row\">
                      <div class=\"col-md-2 col-sm-2\">
                        <img src=\"".getProfileimg($row['usr_id'])."\" alt=\"user\" class=\"profile-photo-lg\" />
                      </div>
                      <div class=\"col-md-7 col-sm-7\">
                        <h5><a href=\"?section=viewprofile&id=".$row['usr_id']."\">".getName($row['usr_id'])."</a></h5>
                        <p>Software Engineer</p>
                        <p class=\"text-muted\">".round(getDistance($_GET['id'], $row['usr_plz']))." km (".$row['usr_ort'].")</p>
                      </div>
                      <div class=\"col-md-3 col-sm-3\">
                       <a href=\"#\" onclick=\"return addfriend('".$row['usr_id']."','".$_GET['id']."');\" class=\"btn btn-primary pull-right\">Freundschaftsanfrage</a>
                      </div>
                    </div>
                  </div>";
    
    									}
    								}else{
    									$return .= 	"<div class=\"nearby-user\">
                    <div class=\"row\">
                      <div class=\"col-md-2 col-sm-2\">
                        <img src=\"".getProfileimg($row['usr_id'])."\" alt=\"user\" class=\"profile-photo-lg\" />
                      </div>
                      <div class=\"col-md-7 col-sm-7\">
                        <h5><a href=\"?section=viewprofile&id=".$row['usr_id']."\">".getName($row['usr_id'])."</a></h5>
                        <p>Software Engineer</p>
                        <p class=\"text-muted\">".round(getDistance($_GET['id'], $row['usr_plz']))." km (".$row['usr_ort'].")</p>
                      </div>
                      <div class=\"col-md-3 col-sm-3\">
                       <a href=\"#\" onclick=\"return addfriend('".$row['usr_id']."','".$_GET['id']."');\" class=\"btn btn-primary pull-right\">Freundschaftsanfrage</a>
                      </div>
                    </div>
                  </div>";
    								}
    			}
    			}
    			
    			
    			echo $return."</div>";
    			break;
    ...
    der Aufruf erfolgt über folgende JS/JQUERY Funktion:

    Code:
    function search(){
    	var gender = document.getElementById('s_gender').value;
    	var altervon = document.getElementById('s_agev').value;
    	var alterbis = document.getElementById('s_ageb').value;
    	var gewichtvon = document.getElementById('s_gewichtv').value;
    	var gewichtbis = document.getElementById('s_gewichtb').value;
    	var umkreis = document.getElementById('s_umkreis').value;
    	var groessebis = document.getElementById('s_groesseb').value;
    	var groessevon = document.getElementById('s_groessev').value;
    	
    	$.get("php/_sql.php?section=searchuser&id="+<?php echo $_SESSION['ID']; ?>+"&gender="+gender+"&alterv="+altervon+"&alterb="+alterbis+"&gewichtv="+gewichtvon+"&gewichtb="+gewichtbis+"&umkreis="+umkreis+"&groesseb="+groessebis+"&groessev="+groessevon, function(e){
    		$('#output').html(e);
    	})
    }

  2. #2
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.672

    AW: Datenbank Suche optimieren

    Als erstes musst du herausfinden, was da genau wie lange dauert. Dann kann man sich überlegen, wie man da am Besten etwas optimiert.

  3. #3
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.288

    AW: Datenbank Suche optimieren

    Hat MySQL nicht auch fertige Funktionen für die Umkreissuche?

Ähnliche Themen

  1. Abfrage optimieren
    Von TecEye im Forum Serverseitige Programmierung
    Antworten: 11
    Letzter Beitrag: 17-02-2016, 16:42
  2. [mysql] Datenbank in eine andere Datenbank kopieren?
    Von jeko im Forum Serverseitige Programmierung
    Antworten: 9
    Letzter Beitrag: 17-12-2008, 21:11
  3. Slideshow optimieren
    Von Kub im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 11-08-2008, 07:18
  4. [php] suche datenbank mit PLZ
    Von fd0311 im Forum Serverseitige Programmierung
    Antworten: 11
    Letzter Beitrag: 26-09-2006, 19:56
  5. JS optimieren
    Von namenik im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 19-03-2005, 19:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •