Mysql
 sql >> Database >  >> RDS >> Mysql

La vista MySQL esegue sempre la scansione completa della tabella?

Le viste in MySQL non sono indicizzate, quindi per loro stessa natura richiedono una scansione completa ogni volta che vi si accede. In generale, questo rende Views davvero utile solo per le situazioni in cui hai una query statica abbastanza complessa che restituisce un piccolo set di risultati e prevedi di acquisire l'intero set di risultati ogni volta.

Modifica: Ovviamente Views utilizzerà gli indici sulle tabelle sottostanti in modo che la View stessa sia ottimizzata (altrimenti non avrebbe alcun senso da usare) ma poiché non ci sono indici su una View non è possibile per una query WHERE su la vista da ottimizzare.

La costruzione di indici per le viste sarebbe comunque costosa perché, sebbene non abbia provato a profilare nessuna vista, sono abbastanza certo che una tabella temporanea sia costruita dietro le quinte e quindi sia restituito il set di risultati. Ci vuole già molto tempo per costruire la tabella temporanea, non vorrei una vista che tenti anche di indovinare quali indici sono necessari. Il che fa emergere il secondo punto, ovvero che MySQL attualmente non offre un metodo per specificare quali indici utilizzare per una vista, quindi come fa a sapere quali campi devono essere indicizzati? Si indovina in base alla tua domanda?

Potresti prendere in considerazione l'utilizzo di una tabella temporanea perché allora puoi specificare gli indici sui campi nella tabella temporanea. Tuttavia, per esperienza, questo tende ad essere molto, molto lento.

Se tutta questa vista contiene è un SELECT ALL FROM table1, table2, table3; quindi dovrei chiedere perché questa query deve essere in una vista? Se per qualche motivo è assolutamente necessario, potresti voler utilizzare una procedura memorizzata per incapsulare la query in quanto sarai quindi in grado di ottenere prestazioni ottimizzate mantenendo il vantaggio di una chiamata più semplice al database per il set di risultati.