MySql的優化步驟

MySql優化的通常步驟:php

1.經過show status 命令瞭解各類sql的執行效率mysql

  SHOW STATUS提供msyql服務器的狀態信息程序員

  通常狀況下,咱們只須要了解以」Com」開頭的指令sql

  show session status like ‘Com%’:顯示當前的鏈接的統計結果數據庫

  show global status like ‘Com%’ :顯示自數據庫上次啓動至今的統計結果服務器

  注:默認是session級別的session

  其中Com_XXX表示XXX語句所執行的次數。
重點注意:Com_select,Com_insert,Com_update,Com_delete經過這幾個參數,能夠容易地瞭解到當前數據庫的應用是以插入更新爲主仍是以查詢操做爲主,以及各種的SQL大體的執行比例是多少。優化

  另外,還有幾個參數須要注意下:網站

  show status like ‘Connections’// 試圖鏈接MySQL服務器的次數日誌

  show status like ‘Uptime’//服務器工做的時間(單位秒)

  show status like ‘Slow_queries’//慢查詢的次數 (默認是10秒中就當作是慢查詢,以下圖所示)

  

  a) 如何查詢mysql的慢查詢時間

    Show variables like 'long_query_time';

  b) 修改mysql 慢查詢時間

    set long_query_time=2//若是查詢時間超過2秒就算做是慢查詢

2. 定位執行效率較低的SQL語句(dql出現問題的機率較dml的大)

  問題是:如何在一個項目中,找到慢查詢的select語句?

  答案:mysql支持把慢查詢語句記錄到日誌文件中。程序員須要修改php.ini的配置文件,默認狀況下,慢查詢記錄是不開啓的。

  開啓慢查詢記錄的步驟:

  打開 my.ini ,找到 [mysqld] 在其下面添加

  long_query_time = 2

  log-slow-queries = D:/mysql/logs/slow.log #設置把日誌寫在那裏,能夠爲空,系統會給一個缺省的文件

     例子:咱們數據表中有1千萬條的數據量

  DQL語句:SELECT * FROM order_copy WHERE id=12345;

  

  查詢耗時:19s>2s,因此mysql會將該條select語句記錄到慢查詢日誌中

  SELECT * FROM order_copy WHERE id=12345的執行時間:

  添加索引前:19s

  添加索引後:0.08s

3.經過explain分析低效率的SQL語句的執行狀況

  使用explain分析該dql語句:

EXPLAIN SELECT * FROM order_copy WHERE id=12345
會產生以下信息:
select_type:表示查詢的類型。
table:輸出結果集的表
type:表示表的鏈接類型(system和const爲佳)
possible_keys:表示查詢時,可能使用的索引
key:表示實際使用的索引
key_len:索引字段的長度
rows:掃描的行數
Extra:執行狀況的描述和說明

注意:要儘可能避免讓type的結果爲all,extra的結果爲:using filesort

4.肯定問題並採起相應的優化措施

  • 經常使用的優化措施是添加索引。添加索引,咱們不用加內存,不用改程序,不用調sql,只要執行個正確的’create index’,查詢速度就可能提升百倍千倍。可是天下沒有免費的午飯,查詢速度的提升是以插入、更新、刪除的速度爲代價的,這些寫操做,增長了大量的I/O。

例如:給字段id添加索引:

ALTER TABLE order_copy ADD PRIMARY KEY(id)

給1千萬的數據添加primary key 須要耗時: 428秒(7分鐘)

EXPLAIN SELECT * FROM order_copy WHERE id=12345

正是由於給id添加了索引,才使得rows的結果爲1

可是索引並非能夠隨便添加的,如下幾種狀況需牢記在心:

  • 較頻繁的做爲查詢條件字段應該建立索引

    select * from order_copy where id = $id

  • 惟一性太差的字段不適合單首創建索引,即便頻繁做爲查詢條件

   select * from order_copy where sex=’女’

  • 更新很是頻繁的字段不適合建立索引

    select * from order_copy where order_state=’未付款’

  • 不會出如今WHERE子句中字段不應建立索引

索引的類型:

  • PRIMARY 索引      => 在主鍵上自動建立
  • INDEX 索引          => 就是普通索引
  • UNIQUE 索引        => 至關於INDEX + Unique
  • FULLTEXT            => 只在MYISAM 存儲引擎支持, 目的是全文索引,在內容系統中用的多, 在全英文網站用多(英文詞獨立). 中文數據不經常使用,意義不大 國內全文索引一般 使用 sphinx 來完成.

索引的使用

  • 創建索引 create [UNIQUE|FULLTEXT]  index index_name on tbl_name (col_name [(length)] [ASC | DESC] , …..);
    alter table table_name ADD INDEX [index_name] (index_col_name,...)

    添加主鍵(索引) ALTER TABLE 表名 ADD PRIMARY KEY(列名,..); 聯合主鍵

    • 刪除索引 DROP INDEX index_name ON tbl_name;
      alter table table_name drop index index_name;
    • 刪除主鍵(索引)比較特別: alter table t_b drop primary key;
    • 查詢索引(都可) show index from table_name;show keys from table_name;desc table_Name;
相關文章
相關標籤/搜索