chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL性能優(yōu)化實(shí)戰(zhàn)

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2025-09-17 16:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MySQL性能優(yōu)化實(shí)戰(zhàn):從慢查詢(xún)到億級(jí)數(shù)據(jù)優(yōu)化的進(jìn)階之路

你是否遇到過(guò)這些場(chǎng)景:凌晨3點(diǎn)被告警電話吵醒,數(shù)據(jù)庫(kù)CPU飆到100%?一條簡(jiǎn)單的查詢(xún)語(yǔ)句要跑30秒?明明加了索引,查詢(xún)還是慢如蝸牛?

作為一名運(yùn)維工程師,我在過(guò)去8年里處理過(guò)無(wú)數(shù)MySQL性能問(wèn)題。今天,我將分享那些讓我"踩坑無(wú)數(shù)"卻最終練就一身本領(lǐng)的實(shí)戰(zhàn)經(jīng)驗(yàn)。這篇文章不講虛的理論,只分享真實(shí)場(chǎng)景下的優(yōu)化技巧。

一、性能問(wèn)題診斷:找到瓶頸比優(yōu)化更重要

1.1 慢查詢(xún)?nèi)罩荆盒阅軉?wèn)題的第一手證據(jù)

很多運(yùn)維同學(xué)知道慢查詢(xún)?nèi)罩?,但真正?huì)用的不多。我見(jiàn)過(guò)太多人開(kāi)啟了慢查詢(xún)卻從不分析,白白浪費(fèi)了這個(gè)強(qiáng)大的工具。

快速開(kāi)啟慢查詢(xún)?nèi)罩荆?/strong>

-- 查看當(dāng)前慢查詢(xún)配置
SHOWVARIABLESLIKE'%slow_query%';
SHOWVARIABLESLIKE'long_query_time';

-- 動(dòng)態(tài)開(kāi)啟慢查詢(xún)?nèi)罩荆⒓瓷?,重啟失效?SETGLOBALslow_query_log='ON';
SETGLOBALslow_query_log_file='/var/log/mysql/slow.log';
SETGLOBALlong_query_time=1; -- 超過(guò)1秒的查詢(xún)記錄下來(lái)
SETGLOBALlog_queries_not_using_indexes='ON'; -- 記錄未使用索引的查詢(xún)

慢查詢(xún)分析神器 - pt-query-digest:

# 安裝percona-toolkit
wget https://downloads.percona.com/downloads/percona-toolkit/3.5.0/binary/tarball/percona-toolkit-3.5.0_x86_64.tar.gz
tar -xzvf percona-toolkit-3.5.0_x86_64.tar.gz

# 分析慢查詢(xún)?nèi)罩?,找出TOP 10問(wèn)題SQL
pt-query-digest /var/log/mysql/slow.log > analyze_result.txt

# 只看執(zhí)行時(shí)間最長(zhǎng)的10條SQL
pt-query-digest --limit=10 --order-by=Query_time:sum/var/log/mysql/slow.log

實(shí)戰(zhàn)技巧:我通常會(huì)設(shè)置一個(gè)定時(shí)任務(wù),每天凌晨自動(dòng)分析前一天的慢查詢(xún)?nèi)罩?,并將結(jié)果發(fā)送到郵箱。這樣能第一時(shí)間發(fā)現(xiàn)潛在的性能問(wèn)題。

1.2 實(shí)時(shí)監(jiān)控:抓住性能問(wèn)題的現(xiàn)行犯

當(dāng)數(shù)據(jù)庫(kù)突然變慢時(shí),如何快速定位問(wèn)題?這幾個(gè)命令是我的救命稻草:

-- 查看當(dāng)前正在執(zhí)行的SQL
SHOWPROCESSLIST;
-- 或者使用更詳細(xì)的
SELECT*FROMinformation_schema.processlist
WHEREcommand!='Sleep'
ORDERBYtimeDESC;

-- 查看InnoDB引擎狀態(tài)(包含死鎖信息)
SHOWENGINE INNODB STATUSG

-- 查看表鎖等待情況
SELECT*FROMinformation_schema.innodb_lock_waits;

-- 查看事務(wù)執(zhí)行情況
SELECT*FROMinformation_schema.innodb_trx
WHEREtrx_state='RUNNING'
ORDERBYtrx_started;

實(shí)戰(zhàn)案例:上個(gè)月,我們的訂單系統(tǒng)突然響應(yīng)變慢。通過(guò)SHOW PROCESSLIST發(fā)現(xiàn)有200多個(gè)查詢(xún)?cè)诘却礞i。追查后發(fā)現(xiàn)是一個(gè)開(kāi)發(fā)同學(xué)在生產(chǎn)環(huán)境執(zhí)行了ALTER TABLE操作。教訓(xùn):任何DDL操作都要在業(yè)務(wù)低峰期執(zhí)行,并使用pt-online-schema-change等工具。

1.3 性能指標(biāo)監(jiān)控:構(gòu)建MySQL健康體檢系統(tǒng)

#!/bin/bash
# MySQL性能監(jiān)控腳本 monitor_mysql.sh

MYSQL_USER="monitor"
MYSQL_PASS="your_password"
MYSQL_HOST="localhost"

# 監(jiān)控QPS (每秒查詢(xún)數(shù))
QPS=$(mysql -u${MYSQL_USER}-p${MYSQL_PASS}-h${MYSQL_HOST}-e"SHOW GLOBAL STATUS LIKE 'Questions';"-ss | awk'{print $2}')
sleep1
QPS2=$(mysql -u${MYSQL_USER}-p${MYSQL_PASS}-h${MYSQL_HOST}-e"SHOW GLOBAL STATUS LIKE 'Questions';"-ss | awk'{print $2}')
echo"當(dāng)前QPS:$((QPS2-QPS))"

# 監(jiān)控連接數(shù)
mysql -u${MYSQL_USER}-p${MYSQL_PASS}-h${MYSQL_HOST}-e"
SELECT
  count(*) as total_connections,
  sum(case when command='Sleep' then 1 else 0 end) as sleeping,
  sum(case when command!='Sleep' then 1 else 0 end) as active
FROM information_schema.processlist;"

# 監(jiān)控緩沖池命中率
mysql -u${MYSQL_USER}-p${MYSQL_PASS}-h${MYSQL_HOST}-e"
SELECT
  (1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)) * 100 as hit_ratio
FROM (
  SELECT
    variable_value as Innodb_buffer_pool_reads
  FROM information_schema.global_status
  WHERE variable_name = 'Innodb_buffer_pool_reads'
) a, (
  SELECT
    variable_value as Innodb_buffer_pool_read_requests
  FROM information_schema.global_status
  WHERE variable_name = 'Innodb_buffer_pool_read_requests'
) b;"

二、索引優(yōu)化:讓查詢(xún)飛起來(lái)的核心技術(shù)

2.1 索引設(shè)計(jì)原則:不是越多越好

很多人認(rèn)為索引越多越好,這是個(gè)嚴(yán)重的誤區(qū)。過(guò)多的索引會(huì)導(dǎo)致:

? 寫(xiě)入性能下降(每次INSERT/UPDATE都要維護(hù)索引)

? 占用更多磁盤(pán)空間

? 優(yōu)化器選擇困難,可能選錯(cuò)索引

索引設(shè)計(jì)黃金法則:

-- 案例:電商訂單表
CREATE TABLEorders (
  idBIGINTPRIMARY KEYAUTO_INCREMENT,
  user_idBIGINTNOT NULL,
  order_noVARCHAR(32)NOT NULL,
  status TINYINTNOT NULLDEFAULT0,
  total_amountDECIMAL(10,2)NOT NULL,
  created_at DATETIMENOT NULL,
  updated_at DATETIMENOT NULL,
 
 -- 索引設(shè)計(jì)
 UNIQUEKEY uk_order_no (order_no), -- 訂單號(hào)唯一索引
  KEY idx_user_status (user_id, status, created_at), -- 聯(lián)合索引
  KEY idx_created_at (created_at) -- 時(shí)間索引用于范圍查詢(xún)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

-- 為什么這樣設(shè)計(jì)?
-- 1. order_no經(jīng)常用于精確查詢(xún),設(shè)置唯一索引
-- 2. user_id + status 經(jīng)常一起查詢(xún),建立聯(lián)合索引
-- 3. created_at用于訂單時(shí)間范圍查詢(xún)

2.2 索引失效的坑:明明有索引為什么不走?

-- 創(chuàng)建測(cè)試表
CREATE TABLEusers (
  idINTPRIMARY KEY,
  nameVARCHAR(50),
  ageINT,
  emailVARCHAR(100),
  KEY idx_name (name),
  KEY idx_age (age)
);

-- 索引失效場(chǎng)景1:類(lèi)型不匹配
-- 錯(cuò)誤示例(age是INT類(lèi)型,用字符串查詢(xún))
EXPLAINSELECT*FROMusersWHEREage='25'; -- 可能不走索引

-- 正確示例
EXPLAINSELECT*FROMusersWHEREage=25;

-- 索引失效場(chǎng)景2:使用函數(shù)
-- 錯(cuò)誤示例
EXPLAINSELECT*FROMusersWHEREYEAR(created_at)=2024; -- 不走索引

-- 正確示例
EXPLAINSELECT*FROMusersWHEREcreated_at>='2024-01-01'ANDcreated_at

2.3 索引優(yōu)化實(shí)戰(zhàn):一個(gè)真實(shí)的優(yōu)化案例

上個(gè)季度,我優(yōu)化了一個(gè)查詢(xún)從30秒降到0.1秒,這里分享優(yōu)化過(guò)程:

-- 原始慢查詢(xún)(執(zhí)行時(shí)間:30秒)
SELECT
  o.order_no, o.total_amount, u.name, p.product_name
FROMorders o
JOINusers uONo.user_id=u.id
JOINorder_items oiONo.id=oi.order_id
JOINproducts pONoi.product_id=p.id
WHEREo.created_at>DATE_SUB(NOW(),INTERVAL30DAY)
 ANDo.status=1
 ANDu.city='北京';

-- 使用EXPLAIN分析
EXPLAINSELECT...;
-- 發(fā)現(xiàn)問(wèn)題:orders表全表掃描,沒(méi)有合適的索引

-- 優(yōu)化方案1:添加合適的索引
ALTER TABLEordersADDINDEX idx_status_created (status, created_at);
ALTER TABLEusersADDINDEX idx_city (city);

-- 優(yōu)化方案2:改寫(xiě)SQL,先縮小結(jié)果集
SELECT
  o.order_no, o.total_amount, u.name, p.product_name
FROM(
 SELECT*FROMorders
 WHEREstatus=1
 ANDcreated_at>DATE_SUB(NOW(),INTERVAL30DAY)
  LIMIT1000
) o
JOINusers uONo.user_id=u.idANDu.city='北京'
JOINorder_items oiONo.id=oi.order_id
JOINproducts pONoi.product_id=p.id;

-- 執(zhí)行時(shí)間:0.1秒

三、查詢(xún)優(yōu)化:寫(xiě)出高性能SQL的藝術(shù)

3.1 JOIN優(yōu)化:小表驅(qū)動(dòng)大表

-- 假設(shè) users 表有100萬(wàn)條記錄,orders 表有1000萬(wàn)條記錄
-- 需要查詢(xún)北京用戶(hù)的訂單

-- 低效寫(xiě)法(大表驅(qū)動(dòng)小表)
SELECTo.*, u.name
FROMorders o
LEFTJOINusers uONo.user_id=u.id
WHEREu.city='北京';

-- 高效寫(xiě)法(小表驅(qū)動(dòng)大表)
SELECTo.*, u.name
FROMusers u
INNERJOINorders oONu.id=o.user_id
WHEREu.city='北京';

-- 更好的寫(xiě)法(使用子查詢(xún)先過(guò)濾)
SELECTo.*, u.name
FROMorders o
INNERJOIN(
 SELECTid, nameFROMusersWHEREcity='北京'
) uONo.user_id=u.id;

3.2 分頁(yè)優(yōu)化:大偏移量的解決方案

-- 問(wèn)題:深度分頁(yè)性能差
-- 當(dāng)offset很大時(shí),MySQL需要掃描大量不需要的行
SELECT*FROMordersORDERBYid LIMIT1000000,20; -- 需要掃描1000020行

-- 優(yōu)化方案1:使用覆蓋索引
SELECT*FROMorders o
INNERJOIN(
 SELECTidFROMordersORDERBYid LIMIT1000000,20
) tONo.id=t.id;

-- 優(yōu)化方案2:使用游標(biāo)方式(推薦)
-- 記住上一頁(yè)最后一條記錄的id
SELECT*FROMordersWHEREid>1000000ORDERBYid LIMIT20;

-- 優(yōu)化方案3:使用延遲關(guān)聯(lián)
SELECT*FROMorders o
INNERJOIN(
 SELECTidFROMorders
 WHEREcreated_at>'2024-01-01'
 ORDERBYid
  LIMIT1000000,20
) tUSING(id);

3.3 子查詢(xún)優(yōu)化:EXISTS vs IN vs JOIN

-- 場(chǎng)景:查找有訂單的用戶(hù)
-- 表數(shù)據(jù)量:users 10萬(wàn),orders 100萬(wàn)

-- 方法1:使用IN(當(dāng)子查詢(xún)結(jié)果集小時(shí)效率高)
SELECT*FROMusers
WHEREidIN(SELECTDISTINCTuser_idFROMorders);

-- 方法2:使用EXISTS(當(dāng)外表小,內(nèi)表大時(shí)效率高)
SELECT*FROMusers u
WHEREEXISTS(SELECT1FROMorders oWHEREo.user_id=u.id);

-- 方法3:使用JOIN(通常性能最好)
SELECTDISTINCTu.*FROMusers u
INNERJOINorders oONu.id=o.user_id;

-- 性能對(duì)比腳本
SET@start=NOW(6);
-- 執(zhí)行查詢(xún)
SELECTCOUNT(*)FROMusersWHEREidIN(SELECTuser_idFROMorders);
SELECTTIMESTAMPDIFF(MICROSECOND,@start, NOW(6))/1000000asexecution_time;

四、參數(shù)調(diào)優(yōu):榨干硬件的每一分性能

4.1 內(nèi)存參數(shù)優(yōu)化

-- 查看當(dāng)前buffer pool大小
SHOWVARIABLESLIKE'innodb_buffer_pool_size';

-- 查看buffer pool命中率(應(yīng)該大于95%)
SELECT
  (1-(Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests))*100
 asbuffer_pool_hit_ratio
FROM(
 SELECTvariable_value Innodb_buffer_pool_reads
 FROMinformation_schema.global_status
 WHEREvariable_name='Innodb_buffer_pool_reads'
) a, (
 SELECTvariable_value Innodb_buffer_pool_read_requests
 FROMinformation_schema.global_status
 WHEREvariable_name='Innodb_buffer_pool_read_requests'
) b;

my.cnf 優(yōu)化配置示例:

[mysqld]
# 內(nèi)存優(yōu)化(假設(shè)服務(wù)器有64GB內(nèi)存)
innodb_buffer_pool_size=48G # 物理內(nèi)存的75%
innodb_buffer_pool_instances=8# CPU核數(shù)
innodb_log_file_size=2G # 大事務(wù)場(chǎng)景可以設(shè)置更大
innodb_flush_log_at_trx_commit=2# 性能和安全的平衡
innodb_flush_method= O_DIRECT # 避免雙重緩存

# 連接優(yōu)化
max_connections=2000
max_connect_errors=100000
connect_timeout=10

# 查詢(xún)緩存(MySQL 8.0已移除)
query_cache_type=0# 建議關(guān)閉,用Redis代替

# 臨時(shí)表優(yōu)化
tmp_table_size=256M
max_heap_table_size=256M

# 慢查詢(xún)
slow_query_log=1
long_query_time=1
log_queries_not_using_indexes=1

4.2 硬件層面的優(yōu)化建議

基于我的經(jīng)驗(yàn),硬件優(yōu)化的性?xún)r(jià)比排序:

1.SSD > 內(nèi)存 > CPU:SSD對(duì)數(shù)據(jù)庫(kù)性能提升最明顯

2.RAID配置:RAID10 是最佳選擇(性能和安全的平衡)

3.網(wǎng)絡(luò):萬(wàn)兆網(wǎng)卡,減少網(wǎng)絡(luò)延遲

五、架構(gòu)優(yōu)化:從單機(jī)到分布式的進(jìn)化

5.1 讀寫(xiě)分離:最簡(jiǎn)單有效的擴(kuò)展方案

# Python實(shí)現(xiàn)讀寫(xiě)分離示例
importrandom
importpymysql

classDBRouter:
 def__init__(self):
   # 主庫(kù)(寫(xiě))
   self.master = pymysql.connect(
      host='master.db.com',
      user='root',
      password='password',
      database='mydb'
    )
   
   # 從庫(kù)池(讀)
   self.slaves = [
      pymysql.connect(host='slave1.db.com', ...),
      pymysql.connect(host='slave2.db.com', ...),
    ]
 
 defexecute_write(self, sql, params=None):
   """寫(xiě)操作走主庫(kù)"""
   withself.master.cursor()ascursor:
      cursor.execute(sql, params)
     self.master.commit()
     returncursor.lastrowid
 
 defexecute_read(self, sql, params=None):
   """讀操作隨機(jī)選擇從庫(kù)"""
    slave = random.choice(self.slaves)
   withslave.cursor()ascursor:
      cursor.execute(sql, params)
     returncursor.fetchall()
 
 defexecute_read_master(self, sql, params=None):
   """強(qiáng)制讀主庫(kù)(解決延遲問(wèn)題)"""
   withself.master.cursor()ascursor:
      cursor.execute(sql, params)
     returncursor.fetchall()

# 使用示例
db = DBRouter()
# 寫(xiě)入訂單
order_id = db.execute_write(
 "INSERT INTO orders (user_id, amount) VALUES (%s, %s)",
  (123,99.99)
)
# 立即查詢(xún)需要讀主庫(kù)(避免主從延遲)
order = db.execute_read_master(
 "SELECT * FROM orders WHERE id = %s",
  (order_id,)
)

5.2 分庫(kù)分表:應(yīng)對(duì)億級(jí)數(shù)據(jù)的終極方案

-- 分表方案示例:按用戶(hù)ID取模分表
-- 創(chuàng)建16個(gè)訂單表
CREATE TABLEorders_0LIKEorders_template;
CREATE TABLEorders_1LIKEorders_template;
-- ... 一直到 orders_15

-- 路由算法(應(yīng)用層實(shí)現(xiàn))
-- table_index = user_id % 16
-- 如 user_id = 12345, 則數(shù)據(jù)存在 orders_9 表中
# Python分表路由實(shí)現(xiàn)
classShardingRouter:
 def__init__(self, shard_count=16):
   self.shard_count = shard_count
   
 defget_table_name(self, base_name, sharding_key):
   """根據(jù)分片鍵計(jì)算表名"""
    shard_index = sharding_key %self.shard_count
   returnf"{base_name}_{shard_index}"
 
 definsert_order(self, user_id, order_data):
    table_name =self.get_table_name('orders', user_id)
    sql =f"INSERT INTO{table_name}(user_id, ...) VALUES (%s, ...)"
   # 執(zhí)行SQL
   
 defquery_user_orders(self, user_id):
   """查詢(xún)用戶(hù)訂單(定位到具體分表)"""
    table_name =self.get_table_name('orders', user_id)
    sql =f"SELECT * FROM{table_name}WHERE user_id = %s"
   # 執(zhí)行查詢(xún)
   
 defquery_order_by_id(self, order_id):
   """根據(jù)訂單ID查詢(xún)(需要掃描所有分表)"""
    results = []
   foriinrange(self.shard_count):
      table_name =f"orders_{i}"
      sql =f"SELECT * FROM{table_name}WHERE order_id = %s"
     # 并發(fā)查詢(xún)所有分表
      results.extend(execute_query(sql, order_id))
   returnresults

六、故障處理:那些年踩過(guò)的坑

6.1 死鎖問(wèn)題處理

-- 查看最近的死鎖信息
SHOWENGINE INNODB STATUSG

-- 查找當(dāng)前的鎖等待
SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROMinformation_schema.innodb_lock_waits w
INNERJOINinformation_schema.innodb_trx bONb.trx_id=w.blocking_trx_id
INNERJOINinformation_schema.innodb_trx rONr.trx_id=w.requesting_trx_id;

-- 殺掉阻塞的事務(wù)
KILL12345; -- thread_id

預(yù)防死鎖的最佳實(shí)踐:

1. 保持事務(wù)簡(jiǎn)短

2. 按相同順序訪問(wèn)表和行

3. 使用較低的隔離級(jí)別(如RC)

4. 為表添加合適的索引避免鎖表

6.2 主從延遲問(wèn)題

#!/bin/bash
# 監(jiān)控主從延遲腳本

check_slave_lag() {
  lag=$(mysql -h$1-e"SHOW SLAVE STATUSG"| grep"Seconds_Behind_Master"| awk'{print $2}')
 if["$lag"="NULL"];then
   echo"Slave is not running on$1"
   # 發(fā)送告警
 elif["$lag"-gt 10 ];then
   echo"Warning: Slave lag on$1is${lag}seconds"
   # 發(fā)送告警
 else
   echo"Slave$1is healthy, lag:${lag}s"
 fi
}

# 檢查所有從庫(kù)
forslaveinslave1.db.com slave2.db.com;do
  check_slave_lag$slave
done

6.3 連接池爆滿(mǎn)問(wèn)題

-- 診斷連接問(wèn)題
-- 查看當(dāng)前連接數(shù)
SHOWSTATUSLIKE'Threads_connected';

-- 查看最大連接數(shù)設(shè)置
SHOWVARIABLESLIKE'max_connections';

-- 查看連接來(lái)源分布
SELECT
 user, host,count(*)asconnections,
  GROUP_CONCAT(DISTINCTdb)asdatabases
FROMinformation_schema.processlist
GROUPBYuser, host
ORDERBYconnectionsDESC;

-- 找出長(zhǎng)時(shí)間Sleep的連接
SELECT*FROMinformation_schema.processlist
WHEREcommand='Sleep'
ANDtime>300
ORDERBYtimeDESC;

七、性能優(yōu)化工具箱

7.1 必備工具清單

1.percona-toolkit:MySQL DBA的瑞士軍刀

2.MySQLTuner:一鍵診斷配置問(wèn)題

3.sysbench:壓力測(cè)試工具

4.mysql-sniffer:實(shí)時(shí)抓取SQL語(yǔ)句

5.Prometheus + Grafana:監(jiān)控可視化

7.2 自動(dòng)化優(yōu)化腳本

#!/bin/bash
# auto_optimize.sh - MySQL自動(dòng)優(yōu)化腳本

echo"=== MySQL Performance Auto-Optimization ==="

# 1. 分析慢查詢(xún)
echo"Analyzing slow queries..."
pt-query-digest /var/log/mysql/slow.log --limit=10 > /tmp/slow_analysis.txt

# 2. 檢查表碎片
echo"Checking table fragmentation..."
mysql -e"
SELECT
  table_schema, table_name,
  ROUND(data_free/1024/1024, 2) as data_free_mb
FROM information_schema.tables
WHERE data_free > 100*1024*1024
ORDER BY data_free DESC;"

# 3. 分析索引使用情況
echo"Analyzing index usage..."
mysql -e"
SELECT
  object_schema, object_name, index_name,
  count_star as usage_count
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE object_schema NOT IN ('mysql', 'performance_schema')
AND index_name IS NOT NULL
ORDER BY count_star DESC
LIMIT 20;"

# 4. 生成優(yōu)化建議
echo"Generating optimization recommendations..."
mysqltuner --outputfile /tmp/mysqltuner_report.txt

echo"Optimization report generated at /tmp/"

實(shí)戰(zhàn)總結(jié):優(yōu)化是個(gè)系統(tǒng)工程

經(jīng)過(guò)這些年的實(shí)戰(zhàn),我總結(jié)出MySQL優(yōu)化的核心原則:

1.監(jiān)控先行:沒(méi)有監(jiān)控就沒(méi)有優(yōu)化。建立完善的監(jiān)控體系是第一步。

2.對(duì)癥下藥:不要盲目?jī)?yōu)化。先找到瓶頸,再針對(duì)性解決。

3.小步快跑:每次只改一個(gè)參數(shù),觀察效果后再繼續(xù)。避免"優(yōu)化過(guò)度"。

4.備份為王:任何優(yōu)化操作前,先備份。我見(jiàn)過(guò)太多"優(yōu)化變故障"的案例。

5.持續(xù)學(xué)習(xí):MySQL在不斷進(jìn)化,8.0的很多特性都值得研究。

寫(xiě)在最后

MySQL優(yōu)化不是一蹴而就的,它需要持續(xù)的觀察、分析和調(diào)整。希望這篇文章能給你一些啟發(fā)。如果你在實(shí)際工作中遇到了有趣的優(yōu)化案例,歡迎在評(píng)論區(qū)分享。

記?。?strong>最好的優(yōu)化是不需要優(yōu)化。在設(shè)計(jì)之初就考慮性能問(wèn)題,比事后優(yōu)化要輕松得多。

如果這篇文章對(duì)你有幫助,別忘了點(diǎn)贊收藏。我會(huì)持續(xù)分享更多運(yùn)維實(shí)戰(zhàn)經(jīng)驗(yàn),下期我們聊聊"Kubernetes故障排查的18般武藝"。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11186

    瀏覽量

    221192
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3978

    瀏覽量

    67407
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    890

    瀏覽量

    28862

原文標(biāo)題:MySQL性能優(yōu)化實(shí)戰(zhàn):從慢查詢(xún)到億級(jí)數(shù)據(jù)優(yōu)化的進(jìn)階之路

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    MySQL的執(zhí)行過(guò)程 SQL語(yǔ)句性能優(yōu)化常用策略

    回顧 MySQL 的執(zhí)行過(guò)程,幫助介紹如何進(jìn)行 sql 優(yōu)化。
    的頭像 發(fā)表于 12-12 10:26 ?1136次閱讀
    <b class='flag-5'>MySQL</b>的執(zhí)行過(guò)程 SQL語(yǔ)句<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>常用策略

    MySQL性能優(yōu)化淺析及線上案例

    作者:京東健康 孟飛 1、 數(shù)據(jù)庫(kù)性能優(yōu)化的意義 業(yè)務(wù)發(fā)展初期,數(shù)據(jù)庫(kù)中量一般都不高,也不太容易出一些性能問(wèn)題或者出的問(wèn)題也不大,但是當(dāng)數(shù)據(jù)庫(kù)的量級(jí)達(dá)到一定規(guī)模之后,如果缺失有效的預(yù)警、監(jiān)控、處理等
    的頭像 發(fā)表于 10-22 15:17 ?1189次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>淺析及線上案例

    mysql數(shù)據(jù)庫(kù)優(yōu)化方案

    MySQL千萬(wàn)級(jí)大表優(yōu)化解決方案
    發(fā)表于 08-19 12:18

    mysql的查詢(xún)優(yōu)化

    mysql查詢(xún)優(yōu)化
    發(fā)表于 03-12 11:06

    MySQL優(yōu)化之查詢(xún)性能優(yōu)化之查詢(xún)優(yōu)化器的局限性與提示

    MySQL優(yōu)化三:查詢(xún)性能優(yōu)化之查詢(xún)優(yōu)化器的局限性與提示
    發(fā)表于 06-02 06:34

    MySQL索引使用優(yōu)化和規(guī)范

    MySQL - 索引使用優(yōu)化和規(guī)范
    發(fā)表于 06-15 16:01

    MySql5.6性能優(yōu)化最佳實(shí)踐

    MySql5.6性能優(yōu)化最佳實(shí)踐
    發(fā)表于 09-08 08:47 ?13次下載
    <b class='flag-5'>MySql</b>5.6<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>最佳實(shí)踐

    MySQL數(shù)據(jù)庫(kù):理解MySQL性能優(yōu)化、優(yōu)化查詢(xún)

    最近一直在為大家更新MySQL相關(guān)學(xué)習(xí)內(nèi)容,可能有朋友不懂MySQL的重要性。在程序,語(yǔ)言,架構(gòu)更新?lián)Q代頻繁的今天,MySQL 恐怕是大家使用最多的存儲(chǔ)數(shù)據(jù)庫(kù)了。由于MySQL
    的頭像 發(fā)表于 07-02 17:18 ?3462次閱讀
    <b class='flag-5'>MySQL</b>數(shù)據(jù)庫(kù):理解<b class='flag-5'>MySQL</b>的<b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>、<b class='flag-5'>優(yōu)化</b>查詢(xún)

    如何優(yōu)化MySQL百萬(wàn)數(shù)據(jù)的深分頁(yè)問(wèn)題

    我們?nèi)粘W龇猪?yè)需求時(shí),一般會(huì)用limit實(shí)現(xiàn),但是當(dāng)偏移量特別大的時(shí)候,查詢(xún)效率就變得低下。本文將分四個(gè)方案,討論如何優(yōu)化MySQL百萬(wàn)數(shù)據(jù)的深分頁(yè)問(wèn)題,并附上最近優(yōu)化生產(chǎn)慢SQL的實(shí)戰(zhàn)
    的頭像 發(fā)表于 04-06 15:12 ?2286次閱讀

    你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?1

    你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?你會(huì)怎么回答? 所謂的性能優(yōu)化,一般針對(duì)的是MySQL
    的頭像 發(fā)表于 03-03 10:23 ?845次閱讀
    你會(huì)從哪些維度進(jìn)行<b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>?1

    你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?2

    你會(huì)從哪些維度進(jìn)行MySQL性能優(yōu)化?你會(huì)怎么回答? 所謂的性能優(yōu)化,一般針對(duì)的是MySQL
    的頭像 發(fā)表于 03-03 10:23 ?801次閱讀
    你會(huì)從哪些維度進(jìn)行<b class='flag-5'>MySQL</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>?2

    MySQL性能優(yōu)化方法

    MySQL 性能優(yōu)化是一項(xiàng)關(guān)鍵的任務(wù),可以提高數(shù)據(jù)庫(kù)的運(yùn)行速度和效率。以下是一些優(yōu)化方法,包括具體代碼和詳細(xì)優(yōu)化方案。
    的頭像 發(fā)表于 11-22 09:59 ?1170次閱讀

    Redis集群部署與性能優(yōu)化實(shí)戰(zhàn)

    Redis作為高性能的內(nèi)存數(shù)據(jù)庫(kù),在現(xiàn)代互聯(lián)網(wǎng)架構(gòu)中扮演著關(guān)鍵角色。作為運(yùn)維工程師,掌握Redis的部署、配置和優(yōu)化技能至關(guān)重要。本文將從實(shí)戰(zhàn)角度出發(fā),詳細(xì)介紹Redis集群的搭建、性能
    的頭像 發(fā)表于 07-08 17:56 ?456次閱讀

    MySQL 8.0性能優(yōu)化實(shí)戰(zhàn)指南

    作為一名運(yùn)維工程師,MySQL數(shù)據(jù)庫(kù)優(yōu)化是我們?nèi)粘9ぷ髦凶罹咛魬?zhàn)性的任務(wù)之一。MySQL 8.0作為當(dāng)前主流版本,在性能、安全性和功能上都有了顯著提升,但如何充分發(fā)揮其潛力,仍需要我們
    的頭像 發(fā)表于 07-24 11:48 ?394次閱讀

    MySQL慢查詢(xún)終極優(yōu)化指南

    作為一名在生產(chǎn)環(huán)境摸爬滾打多年的運(yùn)維工程師,我見(jiàn)過(guò)太多因?yàn)槁樵?xún)導(dǎo)致的線上故障。今天分享一套經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的MySQL慢查詢(xún)分析與索引優(yōu)化方法論,幫你徹底解決數(shù)據(jù)庫(kù)性能瓶頸。
    的頭像 發(fā)表于 08-13 15:55 ?548次閱讀