慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化。 测试用 MySQL 版本。 Server version: 5.6.10-log Source distribution 未做任何慢日志设置时。 mysql show variables like "%que
慢查询有什么用?
它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化。
测试用 MySQL 版本。
Server version: 5.6.10-log Source distribution
未做任何慢日志设置时。
mysql> show variables like "%query%"; +------------------------------+--------------------------------------+ | Variable_name | Value | +------------------------------+--------------------------------------+ | binlog_rows_query_log_events | OFF | | ft_query_expansion_limit | 20 | | have_query_cache | YES | | long_query_time | 10.000000 | | query_alloc_block_size | 8192 | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | | query_prealloc_size | 8192 | | slow_query_log | OFF | | slow_query_log_file | /usr/local/mysql/data/Betty-slow.log | +------------------------------+--------------------------------------+ 13 rows in set (0.01 sec) mysql>
修改配置文件,开启 slow log 。
[root@Betty data]# vi /etc/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the # *** default location during install, and will be replaced if you # *** upgrade to a newer version of MySQL. [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. log_bin=mysql-bin slow_query_log=on slow_query_log_file=mysql-slow long_query_time=2 # These are commonly set, remove the # and set as required. # basedir = ..... # datadir = ..... # port = ..... # server_id = ..... # socket = ..... # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysql] socket = /tmp/mysql.sock
重启 MySQL 。
[root@Betty data]# /etc/init.d/mysql restart Shutting down MySQL.. [ OK ] Starting MySQL. [ OK ] [root@Betty data]#
查看 slow log 。
[root@Betty data]# ll mysql-slow -rw-rw---- 1 mysql mysql 719 Sep 6 12:43 mysql-slow
重新查看系统变量值。
mysql> mysql> show variables like "%query%"; +------------------------------+------------+ | Variable_name | Value | +------------------------------+------------+ | binlog_rows_query_log_events | OFF | | ft_query_expansion_limit | 20 | | have_query_cache | YES | | long_query_time | 2.000000 | | query_alloc_block_size | 8192 | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | | query_prealloc_size | 8192 | | slow_query_log | ON | | slow_query_log_file | mysql-slow | +------------------------------+------------+ 13 rows in set (0.00 sec) mysql>
查看新生成的 slow log 的内容。
[root@Betty data]# cat mysql-slow /usr/local/mysql/bin/mysqld, Version: 5.6.10-log (Source distribution). started with: Tcp port: 0 Unix socket: (null) Time Id Command Argument [root@Betty data]#
测试 slow log 。
mysql> mysql> select 1; +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec) mysql> mysql> select sleep(1); +----------+ | sleep(1) | +----------+ | 0 | +----------+ 1 row in set (1.00 sec) mysql> mysql> mysql> select sleep(3); +----------+ | sleep(3) | +----------+ | 0 | +----------+ 1 row in set (3.00 sec) mysql> mysql> select sleep(4); +----------+ | sleep(4) | +----------+ | 0 | +----------+ 1 row in set (4.01 sec) mysql> mysql> mysql> select sleep(5); +----------+ | sleep(5) | +----------+ | 0 | +----------+ 1 row in set (5.00 sec) mysql> select sleep(2); +----------+ | sleep(2) | +----------+ | 0 | +----------+ 1 row in set (2.01 sec) mysql> mysql> select sleep(1); +----------+ | sleep(1) | +----------+ | 0 | +----------+ 1 row in set (1.00 sec) mysql> select 2; +---+ | 2 | +---+ | 2 | +---+ 1 row in set (0.00 sec) mysql>
查看此时 slow log 的内容。
[root@Betty data]# cat mysql-slow /usr/local/mysql/bin/mysqld, Version: 5.6.10-log (Source distribution). started with: Tcp port: 0 Unix socket: (null) Time Id Command Argument # Time: 130906 12:52:51 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 3.002864 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1378443171; select sleep(3); # Time: 130906 12:53:01 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 4.001943 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1378443181; select sleep(4); # Time: 130906 12:53:09 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 5.002093 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1378443189; select sleep(5); # Time: 130906 12:53:15 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 2.002984 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 SET timestamp=1378443195; select sleep(2); [root@Betty data]#
实验:
a. 使用 mysql 自带慢查询日志分析工具 mysqldumpslow 。
[root@Betty data]# mysqldumpslow mysql-slow Reading mysql slow query log from mysql-slow Count: 4 Time=3.50s (14s) Lock=0.00s (0s) Rows=1.0 (4), root[root]@localhost select sleep(N) [root@Betty data]#
b. 使用 hackmysql.com 推出的一款日志分析工具 mysqlsla 。
[root@Betty data]# mysqlsla -lt slow mysql-slow Report for slow logs: mysql-slow 4 queries total, 1 unique Sorted by 't_sum' Grand Totals: Time 14 s, Lock 0 s, Rows sent 4, Rows Examined 0 ______________________________________________________________________ 001 ___ Count : 4 (100.00%) Time : 14.009884 s total, 3.502471 s avg, 2.002984 s to 5.002093 s max (100.00%) Lock Time (s) : 0 total, 0 avg, 0 to 0 max (0.00%) Rows sent : 1 avg, 1 to 1 max (100.00%) Rows examined : 0 avg, 0 to 0 max (0.00%) Database : Users : root@localhost : 100.00% (4) of query, 100.00% (4) of all users Query abstract: SET timestamp=N; SELECT sleep(N); Query sample: SET timestamp=1378443171; select sleep(3); [root@Betty data]#
c. 使用德国人写的 mysql_explain_slow_log 。(不知道为什么未统计出信息)
[root@Betty WGET_DIR]# ./mysql_explain_slow_log --user=root --password= --socket=/tmp/mysql.sock <p> d. </p> <p> google code 上的一个分析工具 mysql_filter_slow_log (最后更新日期为2007年),提供了 python 和 php 两种可执行的脚本。 </p> <pre class="brush:php;toolbar:false">[root@Betty WGET_DIR]# python mysql_filter_slow_log.py /usr/local/mysql/data/mysql-slow --no-duplicates --sort-execution-count --top=10 # Execution count: 1 time on 2013-09-06 16:07:23. # Column : avg | max | sum # Query time : 5 | 5 | 5 # Lock time : 0 | 0 | 0 # Rows examined: 0 | 0 | 0 # Rows sent : 1 | 1 | 1 # User@Host: root[root] @ localhost [] Id: 1 SET timestamp=1378454843;select sleep(5); # Execution count: 1 time on 2013-09-06 16:07:15. # Column : avg | max | sum # Query time : 4 | 4 | 4 # Lock time : 0 | 0 | 0 # Rows examined: 0 | 0 | 0 # Rows sent : 1 | 1 | 1 # User@Host: root[root] @ localhost [] Id: 1 SET timestamp=1378454835;select sleep(4); # Execution count: 1 time on 2013-09-06 16:07:01. # Column : avg | max | sum # Query time : 3 | 3 | 3 # Lock time : 0 | 0 | 0 # Rows examined: 0 | 0 | 0 # Rows sent : 1 | 1 | 1 # User@Host: root[root] @ localhost [] Id: 1 SET timestamp=1378454821;select sleep(3); # Execution count: 1 time on 2013-09-06 16:07:28. # Column : avg | max | sum # Query time : 2 | 2 | 2 # Lock time : 0 | 0 | 0 # Rows examined: 0 | 0 | 0 # Rows sent : 1 | 1 | 1 # User@Host: root[root] @ localhost [] Id: 1 SET timestamp=1378454848;select sleep(2); [root@Betty WGET_DIR]#
e. 使用 percona-toolkit 中的 pt-query-digest (在《高性能MySQL》中多次提出,值得使用的工具)。
[root@Betty data]# pt-query-digest --user=root mysql-slow # 120ms user time, 10ms system time, 20.21M rss, 68.70M vsz # Current date: Mon Sep 9 13:21:38 2013 # Hostname: Betty # Files: mysql-slow # Overall: 4 total, 1 unique, 0.15 QPS, 0.52x concurrency ________________ # Time range: 2013-09-06 16:07:01 to 16:07:28 # Attribute total min max avg 95% stddev median # ============ ======= ======= ======= ======= ======= ======= ======= # Exec time 14s 2s 5s 4s 5s 1s 4s # Lock time 0 0 0 0 0 0 0 # Rows sent 4 1 1 1 1 0 1 # Rows examine 0 0 0 0 0 0 0 # Query size 60 15 15 15 15 0 15 # Profile # Rank Query ID Response time Calls R/Call V/M Item # ==== ================== ============== ===== ====== ===== ====== # 1 0xF9A57DD5A41825CA 14.0097 100.0% 4 3.5024 0.36 SELECT # Query 1: 0.15 QPS, 0.52x concurrency, ID 0xF9A57DD5A41825CA at byte 548 # This item is included in the report because it matches --limit. # Scores: V/M = 0.36 # Time range: 2013-09-06 16:07:01 to 16:07:28 # Attribute pct total min max avg 95% stddev median # ============ === ======= ======= ======= ======= ======= ======= ======= # Count 100 4 # Exec time 100 14s 2s 5s 4s 5s 1s 4s # Lock time 0 0 0 0 0 0 0 0 # Rows sent 100 4 1 1 1 1 0 1 # Rows examine 0 0 0 0 0 0 0 0 # Query size 100 60 15 15 15 15 0 15 # String: # Hosts localhost # Users root # Query_time distribution # 1us # 10us # 100us # 1ms # 10ms # 100ms # 1s ################################################################ # 10s+ # EXPLAIN /*!50100 PARTITIONS*/ select sleep(5)\G [root@Betty data]#
慢查询配置项
# I.e. you could add the following lines under the [mysqld] section of your my.ini or my.cnf configuration file: # Log all queries taking more than 3 seconds long_query_time=3 # minimum: 1, default: 10 # MySQL >= 5.1.21 (or patched): 3 seconds = 3000000 microseconds # long_query_time=3.000000 # minimum: 0.000001 (1 microsecond) # Activate the Slow Query Log slow_query_log # >= 5.1.29 # log-slow-queries # deprecated since 5.1.29 # Write to a custom file name (>= 5.1.29) # slow_query_log_file=file_name # default: /data_dir/host_name-slow.log # Log all queries without indexes # log-queries-not-using-indexes # Log only queries which examine at least N rows (>= 5.1.21) # min_examined_row_limit=1000 # default: 0 # Log slow OPTIMIZE TABLE, ANALYZE TABLE, and ALTER TABLE statements # log-slow-admin-statements # Log slow queries executed by replication slaves (>= 5.1.21) # log-slow-slave-statements # MySQL 5.1.6 through 5.1.20 had a default value of log-output=TABLE, so you should force # Attention: logging to TABLE only includes whole seconds information log-output=FILE ## Admin query for online activation is possible since MySQL 5.1 (without server restart) ## SET @@global.slow_query_log=1 ## SET @@global.long_query_time=1 ## Show current variables related to the Slow Query Log ## SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP 'admin|min_examined|log_output|log_queries|log_slave|long|slow_quer'
========= 我是分割线 =========
下面给出网上一篇流传已久的博客文章,供参考(做了部分修正)。
参考:《五款常用mysql slow log分析工具的比较》,原文写于2008年。
mysql slow log 分析工具的比较
mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具。
启用 slow log
在 my.cnf 中设置
[mysqld] slow_query_log=on slow_query_log_file=mysql-slow
重启 MySQL 服务。
五款常用工具
- mysqldumpslow
- mysqlsla
- myprofi
- mysql-explain-slow-log
- mysql-log-filter
mysqldumpslow mysql官方提供的慢查询日志分析工具。输出图表如下:
主要功能包括统计不同慢 sql 的
- 出现次数(Count)
- 执行耗费的平均时间和累计总耗费时间(Time)
- 等待锁耗费的时间(Lock)
- 发送给客户端的行总数(Rows)
- 扫描的行总数(Rows)
- 用户以及sql语句本身(抽象了一下格式,比如 limit 1, 20 用 limit N,N 表示)
mysqlsla hackmysql.com 推出的一款日志分析工具(该网站还维护了 mysqlreport,mysqlidxchk 等比较实用的mysql 工具)。
整体来说,功能非常强大。输出的数据报表非常有利于分析慢查询的原因,包括执行频率、数据量、查询消耗等。
格式说明如下:
- 总查询次数 (queries total),去重后的 sql 数量 (unique)
- 输出报表的内容排序(sorted by)
- 最重大的慢 sql 统计信息,包括平均执行时间、等待锁时间、结果行的总数、扫描的行总数。
- Count --sql 的执行次数及占总的 slow log 数量的百分比。
- Time -- 执行时间,包括总时间、平均时间、最小、最大时间、时间占到总慢 sql 时间的百分比。
- 95% of Time -- 去除最快和最慢的 sql,覆盖率占 95% 的 sql 的执行时间。
- Lock Time -- 等待锁的时间。
- 95% of Lock -- 95% 的慢 sql 等待锁时间。
- Rows sent -- 结果行统计数量,包括平均、最小、最大数量。
- Rows examined -- 扫描的行数量。
- Database -- 属于哪个数据库。
- Users -- 哪个用户、IP、占到所有用户执行的 sql 百分比。
- Query abstract -- 抽象后的 sql 语句。
- Query sample -- sql 语句。
除了以上的输出,官方还提供了很多定制化参数,是一款不可多得的好工具。
mysql-explain-slow-log 德国人写的一个 perl 脚本。
http://www.willamowius.de/mysql-tools.html
http://www.bt285.cn/content.php?id=1196863
功能上有点瑕疵。不仅把所有的 slow log 打印到屏幕上,而且统计也只有数量而已,不推荐使用。
mysql-log-filter google code 上找到的一个分析工具,提供了 python 和 php 两种可执行的脚本。
http://code.google.com/p/mysql-log-filter/
功能上比官方的 mysqldumpslow 多了查询时间的统计信息(平均、最大、累计),其他功能都与 mysqldumpslow 类似。
特色功能除了统计信息外,还针对输出内容做了排版和格式化,保证整体输出的简洁。喜欢简洁报表的朋友,推荐使用一下。
myprofi 纯 php 写的一个开源分析工具.项目在 sourceforge 上。
http://myprofi.sourceforge.net/ ==> 已变为http://sourceforge.net/projects/myprofi/
功能上,列出了总的慢查询次数和类型、去重后的 sql 语句、执行次数及其占总的 slow log 数量的百分比。
从整体输出样式来看,比 mysql-log-filter 还要简洁,省去了很多不必要的内容。对于只想看 sql 语句及执行次数的用户来说,比较推荐。
总结:
工具/功能 | 一般统计信息 | 高级统计信息 | 脚本 | 优势 |
mysqldumpslow | 支持 | 不支持 | perl | mysql官方自带 |
mysqlsla | 支持 | 支持 | perl | 功能强大,数据报表齐全,定制化能力强 |
mysql-explain-slow-log | 支持 | 不支持 | perl | 无 |
mysql-log-filter | 支持 | 部分支持 | python or php | 不失功能的前提下,保持输出简洁 |
myprofi | 支持 | 不支持 | php | 非常精简 |
原文地址:MySQL 之 slow log, 感谢原作者分享。

MySQL uses a GPL license. 1) The GPL license allows the free use, modification and distribution of MySQL, but the modified distribution must comply with GPL. 2) Commercial licenses can avoid public modifications and are suitable for commercial applications that require confidentiality.

The situations when choosing InnoDB instead of MyISAM include: 1) transaction support, 2) high concurrency environment, 3) high data consistency; conversely, the situation when choosing MyISAM includes: 1) mainly read operations, 2) no transaction support is required. InnoDB is suitable for applications that require high data consistency and transaction processing, such as e-commerce platforms, while MyISAM is suitable for read-intensive and transaction-free applications such as blog systems.

In MySQL, the function of foreign keys is to establish the relationship between tables and ensure the consistency and integrity of the data. Foreign keys maintain the effectiveness of data through reference integrity checks and cascading operations. Pay attention to performance optimization and avoid common errors when using them.

There are four main index types in MySQL: B-Tree index, hash index, full-text index and spatial index. 1.B-Tree index is suitable for range query, sorting and grouping, and is suitable for creation on the name column of the employees table. 2. Hash index is suitable for equivalent queries and is suitable for creation on the id column of the hash_table table of the MEMORY storage engine. 3. Full text index is used for text search, suitable for creation on the content column of the articles table. 4. Spatial index is used for geospatial query, suitable for creation on geom columns of locations table.

TocreateanindexinMySQL,usetheCREATEINDEXstatement.1)Forasinglecolumn,use"CREATEINDEXidx_lastnameONemployees(lastname);"2)Foracompositeindex,use"CREATEINDEXidx_nameONemployees(lastname,firstname);"3)Forauniqueindex,use"CREATEU

The main difference between MySQL and SQLite is the design concept and usage scenarios: 1. MySQL is suitable for large applications and enterprise-level solutions, supporting high performance and high concurrency; 2. SQLite is suitable for mobile applications and desktop software, lightweight and easy to embed.

Indexes in MySQL are an ordered structure of one or more columns in a database table, used to speed up data retrieval. 1) Indexes improve query speed by reducing the amount of scanned data. 2) B-Tree index uses a balanced tree structure, which is suitable for range query and sorting. 3) Use CREATEINDEX statements to create indexes, such as CREATEINDEXidx_customer_idONorders(customer_id). 4) Composite indexes can optimize multi-column queries, such as CREATEINDEXidx_customer_orderONorders(customer_id,order_date). 5) Use EXPLAIN to analyze query plans and avoid

Using transactions in MySQL ensures data consistency. 1) Start the transaction through STARTTRANSACTION, and then execute SQL operations and submit it with COMMIT or ROLLBACK. 2) Use SAVEPOINT to set a save point to allow partial rollback. 3) Performance optimization suggestions include shortening transaction time, avoiding large-scale queries and using isolation levels reasonably.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

Zend Studio 13.0.1
Powerful PHP integrated development environment

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

WebStorm Mac version
Useful JavaScript development tools
