Home Page

5 Novembre 2006

MySQL - riscrivere le SELECT IN

Le clausole SELECT IN sono davvero dispendiose in termini computazionali e inoltre hanno diversi limiti. Uno di questi, ad esempio, è che nella query della clausola IN (che chiamerò sottoquery) attualmente non è possibile utilizzare la clausola LIMIT.

Una soluzione consiste nel convertire le query che presentano una clausola SELECT IN in query che adoperano un INNER JOIN tra la tabella d’origine e la sottoquery contenuta nel ramo IN. A quest’ultima, infatti, può essere assegnato un alias che permette di utilizzarla come fosse una vista.

SELECT * FROM products WHERE id IN (SELECT ... FROM ... WHERE...)

Nell’esempio soprastante, la SELECT più esterna va a recuperare tutti i recordset di products in cui il valore di id è uguale ad uno di quelli recuperati dalla sottoquery.

Per limitare i risultati della query (ad esempio in caso di paginazione del risultato) occorre specificare la clausola LIMIT nella query più esterna, in questo modo:

SELECT * FROM products WHERE id IN (SELECT ... FROM ... WHERE...) LIMIT 0,10

Così facendo, però, la sottoquery tornerà tutti i risultati che rispettano la rispettiva clausola WHERE per poi limitare la scelta ai primi dieci risultati con una clausola LIMIT 0,10 nella query più esterna.
Riscrivendo la query nel modo seguente, non solo si riesce ad utilizzare la clausola LIMIT nella sottoquery ma si ottengono miglioramenti notevoli nelle performance.

SELECT p.* FROM products p INNER JOIN (SELECT ... FROM ... WHERE ... LIMIT 0,10) sq ON p.id=sq.id

Pubblicato in MySQL

Leave a Reply

TROVA:

Informazioni su questo blog Informazioni su questo blog Abbonati ai Feed RSS di questo Blog Abbonati ai Feed RSS di questo Blog Scarica il nostro software Scarica il nostro software
Story of Stuff