Slow Query Log Overview

Complete Slow Query Log Overview guide for MariaDB. Complete reference documentation for implementation, configuration, and usage for production use.

The slow query log is a record of SQL queries that took a long time to perform. The log also provides the number of rows affected by slow queries.

circle-info

If your queries contain passwords, the slow query log can contain sensitive information, too. Ensure to store the log files in a safe location.

While MariaDB natively encrypts Binary Logs and Data files, it does not provide built-in encryption for the Slow Query or General Query logs. To secure these, administrators should either log to Internal Tables (combined with Data-at-Rest encryption) or utilize OS-level filesystem encryption.

Enabling the Slow Query Log

The slow query log is disabled by default. To enable it, set log_slow_query to 1, using one of the following methods.

This turns on slow query logging immediately, but only until the next server restart:

SET GLOBAL slow_query_log=1;

To make this permanent, configure it in a server option group in an option file, then restart the server:

[mariadb]
slow_query_log

To verify that slow query logging is enabled, and to see which log file is used, issue this statement:

SHOW GLOBAL VARIABLES LIKE 'slow_query_log%';
+---------------------+-----------------------------------------------+
| Variable_name       | Value                                         |
+---------------------+-----------------------------------------------+
| slow_query_log      | ON                                            |
| slow_query_log_file | c525d37c-b2ff-4543-b06f-87012d142d44-slow.log |
+---------------------+-----------------------------------------------+

Configuring the Filename

By default, the slow query log is written to ${hostname}-slow.log (for instance, c525d37c-b2ff-4543-b06f-87012d142d44-slow.log), and stored in the datadir directory. However, this can be changed.

Configure the slow query log filename by setting the slow_query_log_file system variable (or, from MariaDB 10.11, log_slow_query_file). It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Setting a relative path, or just the filename, puts the log file in the datadir directory. You can put it somewhere else by using an absolute path:

Another way to configure the slow query log filename is to set the log-basename option, which configures MariaDB to use a common prefix for all log files (e.g. slow query log, general query log, error log, binary logs, etc.). The slow query log filename will be built by adding -slow.log to this prefix. This option cannot be set dynamically. It can be set in a server option group in an option file prior to starting up the server. For example:

circle-info

If you configure all log file basenames using --log-basename, you cannot use an absolute path – the log file name is always relative to the datadir directory.

Choosing the Output Destination

The slow query log can either be written to a file or to the slow_log table in the mysql database. To choose the slow query log output destination, set the log_output system variable.

To verify what logging method is used, issue this query:

File Logging

File logging is the default. You can configure it explicitly by setting the log_output system variable to FILE. (For instance, to switch back from the table logging method.)

Enable file logging until server restart:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Parsing Specification (File Format)

When logging to a file, the Slow Query Log uses a multi-line format. Parsers must identify the start of a record and correctly separate the header metadata from the SQL query payload.

Record Start Indicator: Every log entry begins with the literal string: # User@Host:

Header Specification: The metadata section consists of several lines starting with a hash (#). These fields should be mapped as follows:

Line
Component Template
Key Fields

1

# User@Host: {User}[{User}] @ {Host} [{IP}]

User, Host, IP

2

# Thread_id: {ID} Schema: {DB} QC_hit: {No/Yes}

Thread ID, Schema, QC_hit

3

# Query_time: {Float} Lock_time: {Float} ...

Query_time, Lock_time, Rows_sent, Rows_examined

SQL Payload: The lines following the # headers contain the raw SQL statement.

  • Note: The SQL query can span multiple lines.

  • Termination: The record ends when the next # User@Host: indicator is encountered or the file ends.

Parsing Example for Tool Developers

A standard parser regex should look for the following sequence:

  1. Start: ^# User@Host: .*

  2. Metadata Capture: Capture all lines starting with # until a line without a # is reached.

  3. Query Capture: Everything from the first non-# line until the next record start.

Table Logging

The slow query log can either be written to the slow_log table in the mysql database by setting the log_output system variable to TABLE. It can be changed dynamically with SET GLOBAL. For example:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Display the slow query log by issuing this statement:

See Writing logs into tables for more information.

Disabling the Log for a Session

Any user can disable logging for a connection by setting the slow_query_log system variable (or, from MariaDB 10.11, log_slow_query) to 0:

Disabling the Log for Specific Statements

You can disable logging to the slow query log for specific types of statements by setting the log_slow_disabled_statements system variable. This option can only be set permanently, in a server option group in an option file prior, then restarting the server:

Configuring the Slow Query Log Time

The time that defines a slow query can be configured by setting the long_query_time system variable (or, from MariaDB 10.11, log_slow_query_time). It uses a units of seconds, with an optional milliseconds component. The default value is 10. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

To verify this works as intended, you can force a "slow" query to happen. By default, MariaDB won't log a query unless it takes longer than a certain amount of time (10 seconds by default). Check your settings first (output abbreviated):

Run a sleep statement longer than the threshhold of 10 seconds, then inspect the slow query log:

If you use FILE logging, check the contents of the log file in your terminal.

Logging Queries That Don't Use Indexes

It can be beneficial to log queries that don't use indexes to the slow query log, since such queries can usually be optimized, either by adding an index or by doing a slight rewrite. The slow query log can be configured to log queries that don't use indexes regardless of their execution time, by adding the option not_using_index to log_slow_filter, or by setting the log_queries_not_using_indexes system variable to 1. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

As a significant number of queries can run quickly even without indexes, you can use the min_examined_row_limit system variable (or, from MariaDB 10.11, log_slow_min_examined_row_limit) with log_queries_not_using_indexes, to limit the logged queries to those having a material performance impact on the server.

Excluding Queries That Examine Fewer Than a Minimum Row Limit

It can be beneficial to exclude queries that examine fewer than a minimum number of rows from the log. This can be done by setting the min_examined_row_limit system variable, or, from MariaDB 10.11, log_slow_min_examined_row_limit. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Logging Slow Administrative Statements

By default, the slow query log logs administrative statements. To disable that, remove admin from the log_slow_filter system variable. Alternatively, set the log_slow_admin_statements system variable to OFF. The slow query log considers the following statements administrative: ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE. This also includes ALTER SEQUENCE statements.

You can dynamically enable this feature using a SET GLOBAL statement and setting it for just the current connection with LOCAL. Some examples:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Enabling the Slow Query Log for Specific Criteria

It is possible to enable logging to the slow query log for queries that meet specific criteria by configuring the log_slow_filter system variable. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

You can find all options for log_slow_filter at log_slow_filter system variable or at Slow Query Log Extended Statistics.

Throttling the Slow Query Log

The slow query log can create a lot of I/O, so it can be beneficial to throttle it in some cases. The slow query log can be throttled by configuring the log_slow_rate_limit system variable. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

Configuring the Verbosity

There are a few optional pieces of information that can be included in the slow query log for each query. This optional information can be included by configuring the log_slow_verbosity system variable. It can be changed dynamically with SET GLOBAL:

To make this permanent, configure it in a server option group in an option file, then restart the server:

It is possible to have EXPLAIN output printed in the slow query log.

Viewing the Slow Query Log

Slow query logs written to file can be viewed with any text editor, or you can use the mariadb-dumpslow tool, to ease the process by summarizing the information.

Queries that you find in the log are key queries to try to optimize by constructing a more efficient query or by making better use of indexes.

For queries that appear in the log that cannot be optimized in the above ways, perhaps because they are simply very large selects, due to slow hardware, or very high lock/cpu/io contention, using shard/clustering/load balancing solutions, better hardware, or stats tables may help to improve these queries.

Slow query logs written to table can be viewed by querying the slow_log table.

Rotating the Slow Query Log on Unix and Linux

Unix and Linux distributions offer the logrotatearrow-up-right utility, which makes it easy to rotate log files. See Rotating Logs on Unix and Linux for more information on how to use this utility to rotate the slow query log.

This page is licensed: CC BY-SA / Gnu FDL

spinner

Last updated

Was this helpful?