Ottimizzazione: filesort con piccoli LIMIT

Stai visualizzando una vecchia versione di questo article. Visualizza la versione più recente.

Descrizione dell'ottimizzazione

MySQL 5.6 introduce una ottimizzazione per le query ORDER BY ...LIMIT n. Quando n è sufficientemente piccolo, l'ottimizzazione usa una coda di priorità per l'ordinamento. L'alternativa, detto in soldoni, è ordinare l'intero output e poi prendere solo le prime n righe.

L'ottimizzazione è stata portata in MariaDB 10.0, nella versione 10.0.0. Il server non dava però alcuna indicazione utile a capire se questa ottimizzazione veniva usata. (E' così che questa funzionalità è stata progettata da Oracle. In MySQL 5.6, l'unico modo è esaminare l'optimizer_trace, che non è attualmente supportato da MariaDB).

Visibilità dell'ottimizzazione in MariaDB

MariaDB starting with 10.0.13

A partire da MariaDB 10.0.13, vi sono due modi per controllare se il filesort ha usato una coda di priorità.

Variabile di stato

Il primo modo è controllare la variabile di stato Sort_priority_queue_sorts. Essa mostra quante volte un ordinamento è stato eseguito tramite la coda di priorità. (Il numero totale degli ordinamenti è la somma di Sort_range e Sort_scan).

Slow query log

Il secondo modo è controllare lo slow query log. Quando si utilizzano le statistiche estese nello slow query log e si specifica log_slow_verbosity=query_plan, le voci dello slow query log assomigliano alla seguente:

# Time: 140714 18:30:39
# User@Host: root[root] @ localhost []
# Thread_id: 3  Schema: test  QC_hit: No
# Query_time: 0.053857  Lock_time: 0.000188  Rows_sent: 11  Rows_examined: 100011
# Full_scan: Yes  Full_join: No  Tmp_table: No  Tmp_table_on_disk: No
# Filesort: Yes  Filesort_on_disk: No  Merge_passes: 0  Priority_queue: Yes
SET timestamp=1405348239;SET timestamp=1405348239;
select * from t1 where col1 between 10 and 20 order by col2 limit 100;

Si noti "Priority_queue: Yes" nell'ultima riga di commento. (pt-query-digest è in grado di interpretare lo slow query log con il campo Priority_queue)

EXPLAIN non fornisce indicazioni se il filesort utilizza la coda di priorità o un quicksort generico e un algoritmo merge. In entrambi i casi apparirà Using filesort, sia su MariaDB sia su MySQL.

Vedi anche

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.