MySQL Optimization Part 5 - Optimization Tips

MySQL Optimization Part 5 - Optimization Tips

目錄


對於大量插入的數據(比如把一張表的數據導入另一張表中,一般都是 MySQL 管理員乾的事):

  • 對於 MyISAM 存儲引擎,建議先把索引禁用。否則會一邊導入數據,一邊建立索引。

    alter table table_name disable keys;
    loading data//insert語句; 
    alter table table_name enable keys;
  • 對於 InnoDB 存儲引擎

    • 將導入的數據按照主鍵排序
    • set unique_checks=0; //關閉唯一性校驗
    • set autocommit=0; // 關閉自動提交

常見 SQL 語句優化小技巧

  1. 在使用 group by 分組查詢是,默認分組後,還會排序,可能會降低速度. 在 group by 後面增加 order by null 就可以防止排序.
  2. 有些情況下,可以使用連接來替代子查詢。因爲使用 join,MySQL 不需要在內存中創建臨時表。

        select * from dept, emp where dept.deptno=emp.deptno; // 簡單處理方式
        select * from dept left join emp on dept.deptno=emp.deptno; //左外連接,更ok!
  3. 如果想要在含有 or 的查詢語句中利用索引,則 or 之間的每個條件列都必須用到索引,如果沒有索引,則應該考慮增加索引。

  4. 減少額外的排序,通過索引直接返回有序數據。WHERE 條件和 ORDER BY 使用相同的索引,並且 ORDER BY 的順序和索引順序相同,並且 ORDER BY 的字段都是升序或者降序。否則肯定需要額外的排序操作,帶來 Filesort。

    // 以下 SQL 可以使用索引
    SELECT * FROM tablename ORDER BY key_part1, key_part2,...;
    SELECT * FROM tablename WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
    SELECT * FROM tablename ORDER BY key_part1 DESC, key_part2 DESC;
    
    // 以下 SQL 不會使用索引
    SELECT * FROM tablename ORDER BY key_part1 DESC, key_part2 ASC;
    --- order by 的字段混合 ASCDESC
    SELECT * FROM tablename WHERE key2=constant ORDER BY key1;
    --- 用於查詢行的關鍵字與 ORDER BY 中所使用的不相同
    SELECT * FROM tablename ORDER BY key1, key2;
    --- 對不同的關鍵字使用 ORDER BY;
  5. 儘量只使用必要的字段,SELECT 具體的字段名稱而不是 SELECT * 選擇所有字段,這樣可以減少排序區的使用,提高 SQL 性能,。


如何選擇mysql的存儲引擎

在開發中,我們經常使用的存儲引擎 myisam / innodb/ memory

MyISAM 存儲: 如果表對事務要求不高,同時是以查詢和添加爲主的,我們考慮使用myisam存儲引擎. ,比如 bbs 中的 發帖表,回覆表.

InnoDB 存儲: 對事務要求高,保存的數據都是重要數據,我們建議使用INNODB,比如訂單表,賬號表.

MyISAM 和 INNODB的區別

  1. 事務安全
  2. 查詢和添加速度
  3. 支持全文索引
  4. 鎖機制
  5. 外鍵 MyISAM 不支持外鍵, INNODB支持外鍵. (在PHP開發中,通常不設置外鍵,通常是在程序中保證數據的一致)

Memory 存儲: 比如我們數據變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用memory, 速度極快.

如果你的數據庫的存儲引擎是myisam,請一定記住要定時進行碎片整理

# 舉例說明: 
create table test100(id int unsigned ,name varchar(32))engine=myisam;

insert into test100 values(1,’aaaaa’);
insert into test100 values(2,’bbbb’);
insert into test100 values(3,’ccccc’);

# 我們應該定義對myisam進行整理
optimize table test100;

選擇合適的數據類型

  • 在精度要求高的應用中,建議使用定點數來存儲數值,以保證結果的準確性。deciaml 不要用float
  • 對於存儲引擎是MyISAM的數據庫,如果經常做刪除和修改記錄的操作,要定時執行optimize table table_name;功能對錶進行碎片整理。
  • 日期類型要根據實際需要選擇能夠滿足應用的最小存儲的日期類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章