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-digest
中rows examine
項
未命中索引的sql
注意pt-query-digest
中rows examine
和row 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) as
2016電影數量' 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 來過濾資料 關於索引欄位的優化 出...