phpbar.de logo

Mailinglisten-Archive

performance -> SQL-Optimierung

performance -> SQL-Optimierung

Cybot 4t2.com-mysql at tekkno4u.de
Mit Jan 22 20:19:11 CET 2003


mhm, also ohne jetzt die daten die da drinne stehen zu kennen würde ich 
sagen das deine tabellen wahrscheinlich nicht mal mindesten in der 3. 
normalform sind!

außerdem verwirrt mich dein sql total... wieso haust du die ganzen 
where-bedingungen in die joins rein ???

und in dem LEFT JOIN zu insekt_adress_to_bundesland steht auch gar nicht 
wie der die tabellen verknüpfen soll!!! da macht der natürlich ein 
full-table join und das dauert natürlich lange erst recht bei drei 
tabellen !!!!

SELECT *
FROM insekt_adress_to_arten
LEFT JOIN insekt_adress_to_bundesland
ON (insekt_adress_to_arten.art_id = '".$tier."'
AND insekt_adress_to_bundesland.bundesland_id = '".$bundesland."')
LEFT JOIN insekt_adress
ON (insekt_adress_to_arten.adress_id = insekt_adress.adress_id
AND insekt_adress_to_bundesland.adress_id = insekt_adress.adress_id
AND insekt_adress.landkreis LIKE '%$eingabe%'
OR insekt_adress.ortschaften LIKE '%$eingabe%'
AND insekt_adress.active = 'y' )

so würde es wohl besser aussehen:

SELECT *
FROM insekt_adress_to_arten
LEFT JOIN insekt_adress_to_bundesland
ON ([HIER FEHLT DIE JOIN-BEDINGUNG ZWICHEN DEN BEIDEN TABELLEN])
LEFT JOIN insekt_adress
ON (insekt_adress_to_arten.adress_id = insekt_adress.adress_id
AND insekt_adress_to_bundesland.adress_id = insekt_adress.adress_id)
WHERE insekt_adress_to_arten.art_id = '".$tier."'
AND insekt_adress_to_bundesland.bundesland_id = '".$bundesland."'
AND insekt_adress.landkreis LIKE '%$eingabe%'
OR insekt_adress.ortschaften LIKE '%$eingabe%'
AND insekt_adress.active = 'y'


dann kannste mal noch ein EXPLAIN machen da siehste wie der die indizes 
verwendet!

gruß sebastian

Wolfgang Steinhauer wrote:
> Hallo Michael, hallo Listenbewohner,
> 
> 
>>Für weitere Diskussionen ist es evtl. sinnvoll, daß Du die (evtl
> 
> gekürzten)
> 
>>Create-Table/Index statements der Tabellenstrukturen postest.
> 
> 
> Sollt ihr haben, hoffe sind nur nicht zu lang:
> 
> CREATE TABLE insekt_adress (
>   adress_id int(11) NOT NULL auto_increment,
>   member_id int(11) NOT NULL default '0',
>   region_id int(11) NOT NULL default '0',
>   lang char(2) NOT NULL default '',
>   organisation varchar(20) NOT NULL default '',
>   organisation_name varchar(100) NOT NULL default '',
>   vor_name varchar(50) NOT NULL default '',
>   nach_name varchar(50) NOT NULL default '',
>   street varchar(100) NOT NULL default '',
>   city varchar(30) NOT NULL default '',
>   postcode varchar(8) NOT NULL default '',
>   phone varchar(50) NOT NULL default '',
>   phone_free char(1) NOT NULL default 'n',
>   phone_mobil varchar(50) NOT NULL default '',
>   phone_mobil_free char(1) NOT NULL default '',
>   fax varchar(50) NOT NULL default '',
>   fax_free char(1) NOT NULL default '',
>   email varchar(60) NOT NULL default '',
>   email_free char(1) NOT NULL default '',
>   web varchar(150) NOT NULL default '',
>   andere_arten tinytext NOT NULL,
>   ortschaften varchar(255) NOT NULL default '',
>   landkreis varchar(255) NOT NULL default '',
>   bemerk mediumtext NOT NULL,
>   loeschen char(1) NOT NULL default 'n',
>   loesch_bemerk tinytext NOT NULL,
>   last_update datetime NOT NULL default '0000-00-00 00:00:00',
>   active char(1) NOT NULL default 'n',
>   PRIMARY KEY  (adress_id),
>   KEY email (email),
>   KEY region_id (region_id),
>   KEY lang (lang),
>   KEY name (vor_name,nach_name),
>   FULLTEXT KEY landkreis (landkreis),
>   FULLTEXT KEY ortschaften (ortschaften)
> ) TYPE=MyISAM;
> 
> CREATE TABLE insekt_adress_to_bundesland (
>   id int(11) NOT NULL auto_increment,
>   adress_id int(11) NOT NULL default '0',
>   bundesland_id int(11) NOT NULL default '0',
>   PRIMARY KEY  (id),
>   KEY bundesland_id (bundesland_id,adress_id),
>   KEY adress_id (adress_id,bundesland_id)
> ) TYPE=MyISAM;
> 
> Habe hier ein bischen mit kombinierten Indexen experimentiert...
> Hat aber auch nichts gebracht....
> 
> CREATE TABLE insekt_adress_to_arten (
>   id int(11) NOT NULL auto_increment,
>   adress_id int(11) NOT NULL default '0',
>   art_id int(11) NOT NULL default '0',
>   PRIMARY KEY  (id),
>   KEY adress_id (adress_id),
>   KEY art_id (art_id)
> ) TYPE=MyISAM;
> 
> Und hier auch noch einmal das Statemant:
> 
> $sql ="SELECT * FROM insekt_adress_to_arten LEFT JOIN
> insekt_adress_to_bundesland ON "
>      ."(insekt_adress_to_arten.art_id = '".$tier."' "
>      ."AND insekt_adress_to_bundesland.bundesland_id = '".$bundesland."') "
>      ."LEFT JOIN insekt_adress ON (insekt_adress_to_arten.adress_id =
> insekt_adress.adress_id "
>      ."AND insekt_adress_to_bundesland.adress_id = insekt_adress.adress_id "
>      ."AND insekt_adress.landkreis LIKE '%$eingabe%' "
>      ."OR insekt_adress.ortschaften LIKE '%$eingabe%'"
>      ."AND insekt_adress.active = 'y' )";
> 
> Liebe Gruesse,
> wolf
> 

-- 
Sebastian Mendel

info at sebastianmendel.de

www.sebastianmendel.de
www.tekkno4u.de
www.nofetish.com

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive