日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql+性能优化+命令_MySQL性能优化

發布時間:2025/3/12 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql+性能优化+命令_MySQL性能优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、優化思路

數據查詢慢,不代表 SQL 語句寫法有問題。?首先,我們需要找到問題的源頭才能“對癥下藥”。用一張流程圖展示 MySQL 優化的思路:

從圖中可以清楚地看出,導致數據查詢慢的原因有多種,如:緩存失效,在此一段時間內由于高并發訪問導致 MySQL 服務器崩潰;SQL 語句編寫問題;MySQL 服務器參數問題;硬件配置限制 MySQL 服務性能問題等。

二、查看 MySQL 服務器運行的狀態值

如果系統的并發請求數不高,且查詢速度慢,可以忽略該步驟直接進行 SQL 語句調優步驟。執行命令:

show status

由于返回結果太多,此處不貼出結果。其中,再返回的結果中,我們主要關注 “Queries”、“Threads_connected” 和 “Threads_running” 的值,即查詢次數、線程連接數和線程運行數。

我們可以通過執行如下腳本監控 MySQL 服務器運行的狀態值:

#!/bin/bash

while true

do

mysqladmin -uroot -p"密碼" ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt

sleep 1

done

執行該腳本 24 小時,獲取 status.txt 里的內容,再次通過 awk 計算:每秒請求 MySQL 服務的次數

awk '{q=$1-last;last=$1}{printf("%d %d %d\n",q,$2,$3)}'>> status.txt

如果觀察的數據有周期性的變化,需要修改緩存失效策略。

三、獲取需要優化的SQL語句

方式一:查看運行的線程

執行命令:

show processlist

返回結果:

mysql> show processlist;

+----+------+-----------+------+---------+------+----------+------------------+

| Id | User | Host | db | Command | Time | State | Info

+----+------+-----------+------+---------+------+----------+------------------+

| 9 | root | localhost | test | Query | 0 | starting | show processlist

+----+------+-----------+------+---------+------+----------+------------------+

1 row in set (0.00 sec)

從返回結果中我們可以了解該線程執行了什么命令/SQL 語句以及執行的時間。實際應用中,查詢的返回結果會有 N 條記錄。其中,返回的 State 的值是我們判斷性能好壞的關鍵,其值出現如下內容,則該行記錄的 SQL 語句需要優化:

Converting HEAP to MyISAM # 查詢結果太大時,把結果放到磁盤,嚴重

Create tmp table #創建臨時表,嚴重

Copying to tmp table on disk #把內存臨時表復制到磁盤,嚴重

locked #被其他查詢鎖住,嚴重

loggin slow query #記錄慢查詢

Sorting result #排序

方式二:開啟慢查詢日志

在配置文件 my.cnf 中的 [mysqld] 一行下邊添加兩個參數:

slow_query_log = 1

slow_query_log_file=/var/lib/mysql/slow-query.log

long_query_time = 2

log_queries_not_using_indexes = 1

其中,slow_query_log = 1 表示開啟慢查詢;

slow_query_log_file 表示慢查詢日志存放的位置;

long_query_time = 2 表示查詢 >=2 秒才記錄日志;

log_queries_not_using_indexes = 1 記錄沒有使用索引的 SQL 語句。

注意:slow_query_log_file 的路徑不能隨便寫,否則 MySQL 服務器可能沒有權限將日志文件寫到指定的目錄中。建議直接復制上文的路徑。

修改保存文件后,重啟 MySQL 服務。在 /var/lib/mysql/ 目錄下會創建 slow-query.log 日志文件。連接 MySQL 服務端執行如下命令可以查看配置情況。

show variables like 'slow_query%';

show variables like 'long_query_time';

測試慢查詢日志:

mysql> select sleep(2);

+----------+

| sleep(2) |

+----------+

| 0 |

+----------+

1 row in set (2.00 sec)

打開慢查詢日志文件

[root@localhost mysql]# vim /var/lib/mysql/slow-query.log

/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:

Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock

Time Id Command Argument

# Time: 2017-10-05T04:39:11.408964Z

# User@Host: root[root] @ localhost [] Id: 3

# Query_time: 2.001395 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

use test;

SET timestamp=1507178351;

select sleep(2);

我們可以看到剛才執行了 2 秒的 SQL 語句被記錄下來了。雖然在慢查詢日志中記錄查詢慢的 SQL 信息,但是日志記錄的內容密集且不易查閱。因此,我們需要通過工具將 SQL 篩選出來.

MySQL 提供 mysqldumpslow 工具對日志進行分析。我們可以使用 mysqldumpslow --help 查看命令相關用法

常用參數如下:

-s:排序方式,后邊接著如下參數

c:訪問次數

l:鎖定時間

r:返回記錄

t:查詢時間

al:平均鎖定時間

ar:平均返回記錄書

at:平均查詢時間

-t:返回前面多少條的數據

-g:翻遍搭配一個正則表達式,大小寫不敏感

案例:

獲取返回記錄集最多的10個sql

mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log

獲取訪問次數最多的10個sql

mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log

獲取按照時間排序的前10條里面含有左連接的查詢語句

mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log

總結

以上是生活随笔為你收集整理的mysql+性能优化+命令_MySQL性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。