sql >> Database >  >> RDS >> Mysql

SELECT COUNT(*) is traag, zelfs met where-clausule

InnoDB gebruikt geclusterde primaire sleutels, dus de primaire sleutel wordt samen met de rij in de gegevenspagina's opgeslagen, niet in afzonderlijke indexpagina's. Om een ​​bereikscan uit te voeren, moet u nog steeds door alle potentieel brede rijen op gegevenspagina's scannen; merk op dat deze tabel een TEKST-kolom bevat.

Twee dingen die ik zou proberen:

  1. voer optimize table uit . Dit zorgt ervoor dat de gegevenspagina's fysiek in gesorteerde volgorde worden opgeslagen. Dit zou een bereikscan op een geclusterde primaire sleutel mogelijk kunnen versnellen.
  2. maak een extra niet-primaire index op alleen de kolom change_event_id. Hiermee wordt een kopie van die kolom opgeslagen op indexpagina's die veel sneller kunnen worden gescand. Controleer na het maken van het plan het uitleggen om er zeker van te zijn dat het de nieuwe index gebruikt.

(u wilt waarschijnlijk ook de kolom change_event_id bigint unsigned maken als het vanaf nul oploopt)



  1. Lokale tijdelijke tabel in Oracle 10 (voor de reikwijdte van Stored Procedure)

  2. Controleer kolom/sleutel bestaat?

  3. Bereken het aantal gelijktijdige gebeurtenissen in SQL

  4. Hoe een MySQL-schema met gegevens exporteren?