mysql效能優化 簡易版

2021-09-22 16:58:56 字數 3633 閱讀 1999

mysql效能優化

開啟mysql慢查詢

show variables like 'slow_query_log'

set global slow_query_log_file='/var/mysql/mysql_log/mysql-slow.log'

set global log_queries_not_using_index=on;

set global long_query_time=1

mysqldumpslow 引數 日誌檔案路徑

輸出到檔案:

pt-query-digest slow-log > slow_log.report

輸出到資料庫:

pt-query-digest slow-log -review h=127.0.0.1,d=test,p=root,p=3306,u=root,t=query_review --create-reviewtable --review-history t=hostname_slow

查詢次數多且每次耗時長的sql

通常為前幾個查詢sql

io大的sql

pt-query-digestrows examine

未命中索引的sql

注意pt-query-digestrows examinerow send的對比,rows examine遠遠大於row send的sql。

explain sql語句

explain select id,username from student;
table:對應的表

type:最好到最差的連線型別const、eq_reg、ref(常見於連線查詢中)、range、index和all(表掃瞄)

possible_keys:顯示可能應用在這張表中的索引,如果為空,則表示沒有可用的索引。

key:實際使用的索引,為空是表示沒有用到索引

key_len:索引的長度。(越小越好)

ref:顯示索引的哪一列被使用了,如果可能的話是乙個常數。

rows:返回的行數

extra列返回值需要注意:

using filesort:看到這個的話查詢就需要優化了。

using temporary:看到這個的話查詢就需要優化了。一般會出現在group by和order by中。

select max(pay_date) from order;

max:可以建立乙個索引進行操作

count:

count(*)和count(id)的區別:*會統計所有行數,id只統計列不為null的行數

同時查出2023年和2023年電影的數量

select count(release_year='2016' or null) as2016電影數量',count(release_year='2015' or null) as2016電影數量' from film;

通常情況下,一般將子查詢優化為join的方式進行查詢。但是優化時需要注意的是關聯鍵是否存在一對多的關係,要注意重複資料

如果優化成join的方式出現資料重複句,可以使用distinct的方式進行去重處理。
優化前的寫法:

eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join sakila.film_actor using(actor_id) group by file_actor.actor_id;
extra:using temporary; using filesort

group by 優化後的寫法:

eplain select actor.first_name, actor.last_name, c.cnt from sakila.actor inner join ( select actor_id, count(*) as cnt from sakila.film_actor group by actor_id ) as c using(actor_id);
extra:using index

這樣可以減少io等。

limit常用於分頁處理,同時會伴隨order by從句的使用。因此在大多時候會使用filesort的方式進行,從而導致大量的io

explain select id, name, *** from student order by name;

extra:using filesort

優化步驟1:使用索引鍵或者主鍵進行order by排序

explain select id, name, *** from student order by id limit 10, 5;

優化步驟2:使用過濾條件(避免資料量過大時掃瞄記錄數過多的情況)

explain select id, name, *** from student where id > 10000 and id < 100005 order by id limit 1, 5;

1、where從句、order by從句、group by從句、on從句出現的列

2、索引字段越小越好

3、離散度(唯一值越多離散度越大)大的列放在聯合索引的前面

重複索引,如主鍵為id,又宣告了unique(id)的索引

冗餘索引,索引裡麵包好了主鍵。由於innodb中預設索引都包含了主鍵,因此沒有必要在索引裡面再次包含索引。

使用pt-duplicate-key-checker工具進行重複及冗餘索引的檢查

pt-duplicate-key-checker -uroot -ppassword -h 127.0.0.1

對於已經不再使用的索引進行刪除

pt-index-usage -uroot -p'password' mysql-slow.log
1、使用可以存下資料的最小資料型別

2、使用簡單的資料型別。int要比varchar處理上簡單

3、盡可能使用not null屬性

4、盡量少用text型別,非用不可時可以考慮分表

用int來儲存日期時間,使用from_unixtime和unix_timestamp進行轉換。

使用bigint來儲存ip位址,inet_aton(),inet_ntoa()來進行轉換。

以空間換取時間的方式

如果完全按照三正規化的設計會導致關聯表過多等一系列問題。

解決表字段過多的問題

拆分原則:

解決表資料量的問題,拆分後表結構是一樣的。

存在問題:跨分割槽表查詢、統計及後台報表操作

參考:參考:

percon configuration wizard

參考:

mysql效能優化簡書 mysql 效能優化

1 伺服器層面 引數配置優化 減少客戶端使用連線數 可考慮使用快取 2 架構層面 讀寫分離 分庫 分表 分片 3 業務sql層面 檢視慢查詢日誌 sql優化 show variables like slow query 預設關閉 檢視日誌路徑 show variables like long que...

mysql效能優化簡書 MySQL效能優化

1 合理的建立及使用索引,索引不宜過多,過多的索引會占用更多的空間,而且每次增 刪 改操作都會重建索引。2 合理的冗餘字段 盡量建一些大表,考慮資料庫的三正規化和業務設計的取捨 3 select語句中盡量不要使用 count 從表中讀取越多的資料,查詢會變得更慢,因為它會增加了磁碟操作時間和資料網路...

mysql 效能優化簡述

用 explain 分析sql語句。使用max 函式時,給max的字段加索引來優化 把子查詢優化為連表查詢,但要注意有重複資料 優化limit技巧 1.使用有索引的列或主鍵進行order by 2.記錄上一次返回的最大id用where id last max id 來過濾資料 關於索引欄位的優化 出...