資料庫效能問題 索引

2022-09-09 12:45:22 字數 2278 閱讀 6159

一、現象

tps很低,響應時間很長,資料庫伺服器cpu很高(接近100%),應用伺服器負載比較低

二、開啟慢查詢配置

1、在mysql配置檔案/etc/my.cnf中增加:

slow_query_log=1

long_query_time=0.1

slow_query_log 這是乙個布林型變數,預設為真。沒有這變數,資料庫不會列印慢查詢的日誌。

long_query_time=0.1:列印查詢時間超過100ms的日誌

備註:配置完成後,重新啟動mysql服務才能生效,預設情況下,慢查詢日誌生成在/var/lib/mysql 目錄下,日誌名稱為_slow-query.log

2、檢視慢查詢是否開啟:

2.1 開啟資料庫命令列介面:

2.2 執行命令show variables like '%slow_query_log%'

3、慢查詢日誌分析

在/usr/bin 目錄下,使用 mysql 自帶命令 mysqldumpslow ,

mysqldumpslow –s at -t 10 mycentos-slow.log,顯示耗時最長的10條sql語句的執行資訊

-s:排序的意思

at:**erage time,平均響應時間

-t:top,即為返回前面多少條資料

以count: 3979  time=1.14s (4551s)  lock=0.00s (2s)  rows=1.0 (3979)為例:

count:3979  該 sql 總共執行 3979 次

time = 1.14 (4551s) 平均每次執行該 sql 耗時 1.14 秒,總共耗時 3979(次)*1.14(秒)=4551秒

lock=0.00s(2s) lock 時間 2秒

rows =1.0(3979) 每次執行 sql 影響資料庫表中的 1 行記錄,總共影響 1(行)*3979(次)=3979 行記錄

4、執行計畫:

4.1 把上一步驟獲取的sql語句複製到n**icat查詢介面

4.2 在sql語句前加上explain,可以分析這條sql語句的執**況

4.3 type列可能的值:

const:表中只有乙個匹配行,用到primary key或unique key

eq_ref:唯一性索引掃瞄,key的所有部分被連線聯接查詢使用,且key是unique或primary key

ref:非唯一性索引掃瞄,或只使用了聯合索引的最左字首

range:索引範圍掃瞄,在索引列上進行給定範圍內的檢索,如between,in(1,100)

index:遍歷索引...

all:全表掃瞄

從上到下,效能越來越差

三、增加索引:

1、設計表-->索引

2、索引名:idx_欄位名

3、索引型別,一般選擇unique或normal,如果查詢結果只有乙個,選unique;如果查詢結果有多個,選normal

4、索引方法:一般選btree

5、一般表中的索引不能超過4個,因為索引會占用磁碟空間,而且索引會引起更新資料的效能變差

四、聯合索引

聯合索引:乙個索引同時作用於多個字段

聯合索引最左原則

聯合索引檢索資料時,會從最左邊開始匹配(忽略sql欄位順序),如果匹配不到,就不使用索引

如:user表有聯合索引 my_index(a欄位,b欄位,c欄位)

五、分析

資料庫伺服器cpu高,一般都是因為sql執行效率低導致的,可能有三方面原因:

1、資料庫表缺少必要的索引;

2、索引不生效

3、sql不夠優化

資料庫索引效能提公升

乙個索引是儲存的表中乙個特定列的值資料結構 最常見的是b tree 索引是在表的列上建立。所以,要記住的關鍵點是索引包含乙個表中列的值,並且這些值儲存在乙個資料結構中。請記住記住這一點 索引是一種資料結構 b tree 是最常用的用於索引的資料結構。因為它們是時間複雜度低,查詢 刪除 插入操作都可以...

資料庫索引失效問題

通俗的說,索引的作用就像目錄一樣,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構 btree 中,使sql可以快速有效地查詢與鍵值關聯的行。這是因為,建立索引可以大大提高系統的效能。通過建立唯一性索引,可以保證給資料庫...

資料庫索引相關問題

問題1.資料庫為什麼要設計索引?圖書館存了1000w本圖書,要從中找到 架構師之路 一本本查,要查到什麼時候去?於是,圖書管理員設計了一套規則 1 一樓放歷史類,二樓放文學類,三樓放it類 2 it類,又分軟體類,硬體類 3 軟體類,又按照書名音序排序 以便快速找到一本書。與之模擬,資料庫儲存了10...