怎樣優化數據庫?怎樣優化數據庫的查詢效率?

一.優化數據庫的查詢效率

  • 存儲引擎的選擇:如果數據表需要支持事務處理,應該考慮 Innodb 引擎,因爲它完全符合 ACID 的特性;如果數據表不需要支持事務處理,則使用存儲引擎 MyISAM
  • 對查詢進行優化,要儘量避免使用全表掃描,首先應考慮在 where 以及 order by 字句涉及的列上建立相應的索引
  • 儘量避免在 where 子句當中使用 != 或者 > , < 等操作符,否則將導致存儲引擎放棄使用索引,而進行全表掃描
  • 儘量避免在 where 子句當中使用 null 值進行判斷,否則將導致存儲引擎放棄使用索引,而進行全表掃描
  • 儘量避免在 where 子句當中使用 or 的判斷,如果一個字段有索引,一個字段沒有索引,將會導致引擎放棄使用索引,而進行全表掃描
  • 下面的查詢也將導致全表掃描:(不能使用前置百分號)
    select id from t where name like ‘%abc%’;
  • 清楚並不是所有的索引都對查詢有效,SQL 是根據表中的數據來進行查詢優化的,當索引列中有大量數據重複時,查詢可能不會去利用索引,如一表中有字段 sex,男女幾乎各佔用一半時,那麼即使在 sex 上建了索引,也對查詢效率起不了作用
  • 索引並不是越多越好,索引可以提高相應的 select 的效率,但同時也降低了 insert 和 update 的效率,因爲 insert 和 update 時有可能會重建索引,引起兩次查詢,所以怎樣建索引需要慎重考慮,視具體情況而定
  • 儘量使用數字型字段,若只含數值信息的字段儘量不要設計爲字符型,設置爲字符型這將會降低查詢和連接的性能,並會增加存儲開銷。這是因爲引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對於數字型數據而言,只需要比較一次就夠了
  • 應儘量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引,而進行全表掃描(例如: select id from t where num=100*2; )

二.數據庫優化方案

  • 設計表的時候,嚴格按照數據庫設計規範來設計表
  • 使用緩存,把經常訪問,並且不需要經常變化的數據放在緩存中,能夠減少磁盤 IO 讀寫次數,因爲磁盤 IO 傳輸速度很慢
  • 採用 mysql 自帶的表分區技術,把數據分成不同的文件,能夠提高磁盤的讀寫效率
  • 選擇合適的引擎,參數上的優化(能用char(10),就不用char(20))
  • 不採用全文檢索
  • 避免頻繁創建和刪除臨時表,以減少系統表資源的消耗
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章