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

Führt die MySQL-Ansicht immer einen vollständigen Tabellenscan durch?

Ansichten in MySQL werden nicht indiziert, sodass sie naturgemäß bei jedem Zugriff einen vollständigen Scan erfordern. Im Allgemeinen macht dies Views wirklich nur in Situationen nützlich, in denen Sie eine ziemlich komplexe statische Abfrage haben, die eine kleine Ergebnismenge zurückgibt, und Sie planen, jedes Mal die gesamte Ergebnismenge abzurufen.

Bearbeiten: Natürlich verwenden Views die Indizes für die zugrunde liegenden Tabellen, damit die View selbst optimiert wird (andernfalls wäre die Verwendung überhaupt nicht sinnvoll), aber da es keine Indizes für eine View gibt, ist eine WHERE-Abfrage nicht möglich die zu optimierende Ansicht.

Das Erstellen von Indizes für Ansichten wäre sowieso teuer, da ich zwar nicht versucht habe, ein Profil von Ansichten zu erstellen, aber ziemlich sicher bin, dass eine temporäre Tabelle hinter den Kulissen erstellt und dann die Ergebnismenge zurückgegeben wird. Das Erstellen der temporären Tabelle dauert bereits viel Zeit. Ich möchte keine Ansicht, die auch versucht, zu erraten, welche Indizes benötigt werden. Das bringt den zweiten Punkt hervor, nämlich dass MySQL derzeit keine Methode anbietet, um anzugeben, welche Indizes für eine Ansicht verwendet werden sollen. Woher weiß es also, welche Felder indiziert werden müssen? Schätzt es basierend auf Ihrer Anfrage?

Sie könnten erwägen, eine Temporäre Tabelle zu verwenden denn dann können Sie Indizes für Felder in der temporären Tabelle angeben. Erfahrungsgemäß neigt dies jedoch dazu, sehr, sehr langsam zu sein.

Wenn alles, was diese Ansicht enthält, ein SELECT ALL FROM table1, table2, table3 ist; dann müsste ich fragen, warum diese Abfrage überhaupt in einer Ansicht sein muss? Wenn es aus irgendeinem Grund absolut notwendig ist, möchten Sie möglicherweise eine gespeicherte Prozedur verwenden, um die Abfrage zu kapseln, da Sie dann in der Lage sind, eine optimierte Leistung zu erzielen, während Sie den Vorteil eines einfacheren Aufrufs der Datenbank für die Ergebnismenge beibehalten.