一、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磁盤矩陣的磁盤高可用,順序讀寫高,隨機讀寫效率低