MySql 從四個方面談性能優化

一、SQL及索引優化

1、建立慢查日誌,記錄某SQL語句查詢時間,便於定位。工具:mysqldumpslow  -s(排序方式) -t (前幾次)/日誌路徑

工具:pt-query-digest    pt-query-digest 定位有問題的sql語句;a、查詢次數多且每次查詢佔用時間長的SQL 

IO大的SQL(注意 rows examine項)、未命中索引的SQL(rows examine、和rows send項對比)

2、通過慢日誌找到性能低的sql語句後對其進行優化;用工具語句 explain查詢sql的執行計劃,出現using filesort /temporary則需要優化

      max()|count()這種遍地的查詢需要創建索引;創建索引:create index idx_paydete on payment(payment_date);count(*)與count(id)值不同,null行不計入ID數

子查詢優化:select * from t where t.id in (select t1.tid from t1)-->select  t.id from t join t1 on t.id = t1.tid;-->select  distinct(去重) t.id from t join t1 on t.id = t1.tid

group by 的優化:

   limit 查詢的優化:(使用有索引的列或主鍵進行 order by 操作)

select film_id,description from sakila.film order by title limit 50,5;

—>select film_id,description from sakila.film order by film_id limit 50,5; (下面的是記錄上次返回的主鍵,在下次查詢時使用主鍵過濾)

-->select film_id,description from sakila.film where film_id >55 and film_id<=60 order by film_id limit 1,5;

3、如何選擇合適的列建立索引

a、在where 從句,group by 、order by 、on從句出現的列

b、索引字段越小越好

c、離散度大的列放在聯合索引的前面(查離散度:select count(distinct customer_id),count(distinct  staff_id)from payment),

比較誰的count值更大。

4、索引的·優化

a、去除重複冗餘的索引

b、定位重複索引並刪工具: pt-duplicate-key-checker +數據庫用戶名+密碼+ip

c、索引的維護和優化 :配合慢查日誌和pt-index-usage       pt-index-usage+user+密碼+慢查日誌

二、數據庫表結構優化

5、表結構的優化

a、選擇合適的數據類型 比如時間也可以 int型;只需函數from_unixtime(),unix_timestamp()倆個函數進行切換

ip地址需用inet_aton(),inet_ntoa()進行轉換

b、儘可能的選用 not null 定義字段,給出默認值,因爲inodb存儲特性,會對null類型需要額外字段進行存儲

c、儘量少用text類型,非用不可時最好考慮分表(放到附加表)

6、表的範式化和反範式化

a、遵循第三範式,即數據表中不存在非關鍵字段對任意候選關鍵字段的傳遞函數依賴

錯誤實例:數據冗餘;數據的插入異常;數據的更新異常、數據的刪除異常

b、反範式化;空間換取時間,優化查詢速率

7、數據庫表的垂直拆分

解決寬度過寬,導致查詢效率低下:

a、把不常用、大字段的字段單獨放在一個表中

b、把經常一起使用的字段放到一起

8、數據庫的水平拆分

解決表中數據量過大的問題

a、分法eg:mod(customer_id,5)分成0-4共5組

b、挑戰:跨分區表進行數據查詢、統計及後臺報表操作(前後臺業務分開,前臺分,後臺合)

三、系統配置優化

8、操作系統的優化

修改/etc/sysctl.conf文件 ;比如增加tcp支持的隊列數;;;減少斷開連接時,資源回收

/etc/security/limits.conf  #修改打開文件數限制           ulimit -a 查看

使用硬件防火牆,關閉iptables、selinux

9、mysql 系統本身的優化

配置文件 :/etc/my.cnf 或 /etc/mysql/my.cnf

a、調整緩衝池 innodb_buffer_pool_size==75%內存大小和緩衝池個數 innodb_buffer_pool_instances

b、innodb_flush_at_trx_commit =0|1|2s  ,將信息更新到磁盤時間頻率,對io效率影響很大

c、inmodb_read_io_threads和innodb_write_io_threads

d、innodb_file_per_table ==off 共享表空間採用獨立的空間

f、inonodb_stats_on_metadata  ==off  一般操作統計信息刷新關閉

10、第三方工具調mysql系統性能

percona  toolkit

a、pt-mysql-summary #查看mysql的各個統計信息

b、pt-slave-find #查找和顯示指定的Master 有多少個Slave

c、pt-query-digest /data/mysql/master-log.000007 慢日誌查詢
修改表結構並保留原表
pt-online-schema-change, test111庫的tbl_app_table新增app_status字段默認爲0

四、服務器硬件優化

a、選擇哪種cpu核數

b、磁盤io優化:raido:io效果最好,安全不好,無備份    raid1  raid5:最少3個盤,一個用於奇偶校驗 效率爲 n-1/n

網絡SNA 和SNA磁盤矩陣的磁盤高可用,順序讀寫高,隨機讀寫效率低










發佈了134 篇原創文章 · 獲贊 240 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章