2017-07-10 3 views
0

Ist es überhaupt möglich, die Abfrage unten zu optimieren, die heute produziert wurde:Optimieren einer Abfrage mit LEFT mit mehreren JOIN WHERE-Klauseln

SELECT DISTINCT a.*,country,c.id 
id_employer,c.comp_name,c.show_comp_name,comp_type,b.id countryid,if(now() 
<a.hotjob_expire, true, false) is_hot 
FROM j5xap_jbjobs_job a 
LEFT JOIN j5xap_jbjobs_country b ON a.id_country = b.id 
LEFT JOIN j5xap_jbjobs_employer c ON a.employer_id = c.user_id 
LEFT JOIN j5xap_jbjobs_custom_field_value cv ON cv.jobid=a.id 
LEFT JOIN j5xap_jbjobs_comp_type d ON c.id_comp_type = d.id 
WHERE (a.job_title LIKE '%Web developer%' 
    OR a.state LIKE '%Web developer%' 
    OR a.city LIKE '%Web developer%' 
    OR b.country LIKE '%Web developer%' 
    OR c.comp_name LIKE '%Web developer%' 
    OR cv.value LIKE '%Web developer%' 
    OR cv.valuetext LIKE '%Web developer%' 
    OR a.short_desc LIKE '%Web developer%' 
    OR a.long_desc LIKE '%Web developer%') 
    OR (a.job_title LIKE '%kannur%' 
    OR a.state LIKE '%kannur%' 
    OR a.city LIKE '%kannur%' 
    OR b.country LIKE '%kannur%' 
    OR c.comp_name LIKE '%kannur%' 
    OR cv.value LIKE '%kannur%' 
    OR cv.valuetext LIKE '%kannur%' 
    OR a.short_desc LIKE '%kannur%' 
    OR a.long_desc LIKE '%kannur%') 
    AND a.id_job_spec =441 AND a.id_job_spec 
    IN (SELECT id FROM j5xap_jbjobs_job_spec WHERE id_category='63') 
    AND 
    a.is_active='y' AND a.publish_date <= '2017-07-07 00:00:00' 
    AND 
    expire_date >= '2017-07-07 00:00:00' 
    AND 
    expire_date <> '0000-00-00 00:00:00' 
    ORDER BY is_hot DESC, a.is_featured DESC, a.publish_date DESC, a.id      
    DESC LIMIT 0, 10; 

ich es ausgiebig, aber ich bin ein wenig aus gesucht haben Ideen. Linke Joins müssen in diesem Kontext verwendet werden. Ich habe mehrspaltige Indizes für die Tabellen und für die Felder, die aus der SELECT-Klausel abgerufen werden.

Gibt es irgendwelche Ideen? Vielen Dank.

+0

Schauen Sie sich die 'EXPLAIN select ...' Ausgabe an –

+0

Obwohl 'x%' einen Index verwenden kann, kann '% x' das nicht, daher ist die Leistung für diese Art von Abfrage immer begrenzt. – Strawberry

+0

Ich vermute, Sie haben einen Fehler in '... AND a.id_job_spec = 441 AND a.id_job_spec IN (SELECT ...)' Vielleicht wollten Sie 'ODER'? –

Antwort

0

Ich würde mit einem Index beginnen: j5xap_jbjobs_job(id_job_spec, is_active, publish_date, is_expire). Für alle anderen Tabellen benötigen Sie einen Index für die Join-Schlüssel.

Dies sollte die Filterung unter Verwendung eines Indexes ermöglichen, was ein Gewinn für die Leistung sein sollte.