Peter J. Holzer wrote:
> On 2012-07-10 00:44, Aeneas A. <
rtd...@gmx.de> wrote:
>> Ich habe von meinem Betreuer folgende Funktion bekommen:
>>
>> query ="SELECT DISTINCT tbl1.citing_id,tbl1.cited_id FROM (
>> SELECT * FROM `pub_cites_pub` WHERE citing_id IN (
>> SELECT id FROM `publication` WHERE MATCH (title) AGAINST ('"+
>> $searchterm + "' IN BOOLEAN MODE))
>> UNION
>> SELECT * FROM `pub_cites_pub` WHERE cited_id IN (
>> SELECT id FROM `publication` WHERE MATCH (title) AGAINST ('"+
>> $searchterm + "' IN BOOLEAN MODE))
>> ) AS tbl1
>>
>> Diese braucht sehr lange (2 min 30 sek), um ausgeführt zu werden.
Da wäre noch die Frage, ob `SELECT *' sein muss/sollte (ich meine: nein) und
obj MATCH(…), d. h. natürlichsprachliche Volltextsuche über eine
Textsammlung, sein muss.
> MySQL tendiert leider dazu, Subqueries verkehrt herum auszuführen, also
> zuerst die äußere Query und dann für jede Row des Resultats die innere
> Query (wenn ich den Plan, den Du anschließend gepostet hast, richtig
> interpretiere, ist das auch hier der Fall).
s/leider//
Dies ermöglicht es, in der Subquery auf Werte aus der äusseren Abfrage
zuzugreifen. Jedoch wäre es gut, wenn hier optimiert würde, sofern die
Subquery genau das nicht tut. Wobei ich nicht sicher bin, ob das nicht
bereits passiert.
> Wenn Du die Query als Join formulierst, wird es fast sicher schneller.
ACK. Vermutlich war u. a. das *selbst* herauszufinden auch der Sinn dieser
Übung. Ist ja nicht das erste Mal, dass der OP seine Hausaufgaben nicht
selbst macht. Soifz [psf 10.1].
--
PointedEars
Please do not Cc: me. / Bitte keine Kopien per E-Mail.