sql >> Database >  >> RDS >> Mysql

MySQL-syntaxis en 'OF'-prestaties

Jasons antwoord is perfect. Bovendien zou ik proberen de modernere ANSI-joinsyntaxis te gebruiken om de WHERE-clausule te ontlasten, zodat de verwarring daar wordt verlicht:

SELECT o.id
FROM programs o
JOIN titles_programs t ON t.object_id=o.id
JOIN descriptions_programs d ON d.object_id=o.id
WHERE MATCH (d.text) AGAINST ('+china' IN BOOLEAN MODE) AND d.current=1
OR MATCH (t.text) AGAINST ('+china' IN BOOLEAN MODE) AND t.current=1

Dit zal voorkomen dat de onbedoelde kruisverbinding een combinatorische explosie veroorzaakt; Ik zou verwachten dat het binnen een redelijke tijd zou werken, tenzij de database echt enorm was.

Zo niet, kunt u de resultaten van een EXPLAIN SELECT van het bovenstaande posten? Vermoedelijk worden een of beide fulltext indexen niet gebruikt. Ik kan me zeker voorstellen dat de query-optimizer de tweede fulltext-index niet zou gebruiken, door zoiets te doen als proberen de rijen in te vullen die niet overeenkwamen met de eerste fulltext-query in plaats van rechtstreeks naar de index te gaan, of zoiets.

Als u in combinatie met de volledige tekst over twee kolommen wilt indexeren, maakt u normaal gesproken één index over beide kolommen. Dit zou in ieder geval veel sneller zijn. Het zou echter betekenen dat u titels en beschrijvingen in dezelfde tabel moet plaatsen. Dit is misschien niet zo'n moeilijkheid:aangezien fulltext alleen werkt op MyISAM-tabellen (en u uw canonieke gegevens doorgaans niet in MyISAM-tabellen wilt), kunt u de definitieve kopie van uw gegevens bewaren in correct genormaliseerde InnoDB-tabellen, met een extra MyISAM-tabel met alleen gestript en gesteeld zoekaas.

Als dat allemaal niet goed is... nou, ik denk dat ik terug zou gaan naar de UNIONing die je noemde, in combinatie met een filter op applicatieniveau om dubbele ID's te verwijderen.



  1. php-variabele in MySQL-rijnaam

  2. Rails actieve recordquery voor het ophalen van de meest voorkomende objecten

  3. Hoe duplicaten te verwijderen uit een door komma's gescheiden lijst door regexp_replace in Oracle?

  4. Wat betekent Importfout:Symbool niet gevonden:_PQencryptPasswordConn en hoe los ik dit op?