sql >> Database >  >> RDS >> Mysql

Waarom is deze INNER JOIN/ORDER BY mysql-query zo traag?

(Ik neem aan dat je ids.customer_id = customer.customer_id wilde typen en niet customer_ids.customer_id)

Zonder ORDER BY pakte mysql de eerste 10 id's van type 10 (geïndexeerd), zocht de klant op en was klaar. (Merk op dat de LEFT JOIN hier echt een INNER JOIN is, omdat de join-voorwaarden alleen gelden voor rijen die in beide tabellen overeenkomen)

Met ORDER BY haalt mysql waarschijnlijk alles op type=10 klanten en sorteer ze vervolgens op voornaam om de eerste 10 te vinden.

U kunt dit versnellen door ofwel de klantentabel te denormaliseren (kopieer het type naar de klantrecord) of een toewijzingstabel te maken voor de customer_id, name, type tupels. Voeg in beide gevallen een index toe op (type, name) . Als je de toewijzingstabel gebruikt, gebruik deze dan om een ​​3-way join te doen met klanten en ID's.

Als type=10 redelijk gebruikelijk is, kunt u de query ook forceren om de klantentabel op naam te laten lopen en het type voor elk te controleren met STRAIGHT JOIN. Het zal niet zo snel zijn als een samengestelde index, maar het zal sneller zijn dan het ophalen van alle overeenkomsten.

En zoals hierboven gesuggereerd, voer een EXPLAIN uit op uw query om het queryplan te zien dat mysql gebruikt.



  1. Zijn triggers gebaseerd op query's Atomic?

  2. Wat is de beste manier om de initiële databasegegevens naar een iOS-app te downloaden?

  3. Een rij invoegen in een tabel tussen twee bestaande rijen in Sql

  4. Gegevens ophalen van Mysql DB naar listView met JSON en PHP