Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SELECT COUNT(*) ist langsam, sogar mit where-Klausel

InnoDB verwendet geclusterte Primärschlüssel, sodass der Primärschlüssel zusammen mit der Zeile in den Datenseiten und nicht in separaten Indexseiten gespeichert wird. Um einen Bereichsscan durchzuführen, müssen Sie immer noch alle potenziell breiten Zeilen in Datenseiten scannen; Beachten Sie, dass diese Tabelle eine TEXT-Spalte enthält.

Zwei Dinge, die ich versuchen würde:

  1. führen Sie optimize table aus . Dadurch wird sichergestellt, dass die Datenseiten physisch in sortierter Reihenfolge gespeichert werden. Dies könnte möglicherweise einen Bereichsscan auf einem geclusterten Primärschlüssel beschleunigen.
  2. Erstellen Sie einen zusätzlichen nicht primären Index nur für die Spalte change_event_id. Dadurch wird eine Kopie dieser Spalte in Indexseiten gespeichert, die viel schneller zu scannen sind. Überprüfen Sie nach der Erstellung den EXPLAIN-Plan, um sicherzustellen, dass der neue Index verwendet wird.

(Wahrscheinlich möchten Sie auch die Spalte change_event_id bigint unsigned machen wenn es von Null an inkrementiert wird)