mysql優化

--------------------韓順平筆記整理


  • 要保證數據庫的效率,要做好以下四個方面的工作:
  1.  數據庫設計
  2.  sql語句優化
  3.  數據庫參數配置
  4.  恰當的硬件資源和操作系統

  • 數據庫表設計

    1. 1NF :就是具有原子性,不可分割.(只要使用的是關係性數據庫,就自動符合)

    2. 2NF: 在滿足1NF 的基礎上,我們考慮是否滿足2NF: 只要表的記錄滿足唯一性,也是說,你的同一張表,不可能出現完全相同的記錄, 一般說我們在 表中設計一個主鍵即可.

    3. 3NF: 在滿足2NF 的基礎上,我們考慮是否滿足3NF:即我們的字段信息可以通過關聯的關係,派生即可.(通常我們通過外鍵來處理)

    1. 逆範式: 爲什麼需呀逆範式.

      (相冊的功能對應數據庫的設計)

      適當的逆範式.


      不適當的逆範式



      SQL語句優化 
      1.sql語句優化的一般步驟
      ①通過show status命令瞭解各種SQL的執行頻率。
      ②定位執行效率較低的SQL語句-(重點select)
      ③通過explain分析低效率的SQL語句的執行情況
      ④確定問題並採取相應的優化措施

      2.show status命令
      該命令可以顯示你的mysql數據庫的當前狀態.我們主要關心的是 “com”開頭的指令
      show status like ‘Com%’ <=> show session status like ‘Com%’ //顯示當前控制檯的情況
      show global status like ‘Com%’ ; //顯示數據庫從啓動到 查詢的次數

      3.顯示查看慢查詢的情況:

      3.1show variables like ‘long_query_time’

      3.2啓動慢查詢 啓動 xx>bin\mysqld.exe –slow-query-log

      4.索引的原理

      4.1

      4.2 介紹一款非常重要工具 explain, 這個分析工具可以對 sql語句進行分析,可以預測你的sql執行的效率.
      他的基本用法是:explain sql語句\G
      //根據返回的信息,我們可知,該sql語句是否使用索引,從多少記錄中取出,可以看到排序的方式.

      4.3 在什麼列上添加索引比較合適

      ① 在經常查詢的列上加索引.
      ② 列的數據,內容就只有少數幾個值,不太適合加索引
      ③ 內容頻繁變化,不合適加索引

      4.4 索引的種類

      ① 主鍵索引 (把某列設爲主鍵,則就是主鍵索引)
      ② 唯一索引(unique) (即該列具有唯一性,同時又是索引)
      ③ index (普通索引)
      ④ 全文索引(FULLTEXT)
      select * from article where content like ‘%李連杰%’;
      hello, i am a boy
      你好,我是一個男孩 =>中文 sphinx

      ⑤ 複合索引(多列和在一起)create index myind on 表名 (列1,列2);

      4.5 如何創建、刪除、顯示索引

      如果創建unique / 普通/fulltext 索引
      1. create [unique|FULLTEXT] index 索引名 on 表名 (列名...)
      2. alter table 表名 add index 索引名 (列名...)
      如果要添加主鍵索引
      alter table 表名 add primary key (列...)


      刪除索引
      1. drop index 索引名 on 表名
      2. alter table 表名 drop index index_name;
      3. alter table 表名 drop primary key

      顯示索引
      show index(es) from 表名
      show keys from 表名
      desc 表名


      4.6使用索引的注意事項

      查詢要使用索引最重要的條件是查詢條件中需要使用索引。
      下列幾種情況下有可能使用到索引:
      1,對於創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。
      2,對於使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引‘aaa%’ 會使用到索引。
      下列的表將不使用索引:
      1,如果條件中有or,即使其中有條件帶索引也不會使用。
      2,對於多列索引,不是使用的第一部分,則不會使用索引。
      3,like查詢是以%開頭
      4,如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則不使用索引。
      5,如果mysql估計使用全表掃描要比使用索引快,則不使用索引

      4.7 如何檢測你的索引是否有效

      結論:Handler_read_key 越大越少

      Handler_read_rnd_next 越小越好


      5. MyISAM 和 Innodb區別是什麼

      1. MyISAM 不支持外鍵, Innodb支持
      2. MyISAM 不支持事務,不支持外鍵.
      3. 對數據信息的存儲處理方式不同.(如果存儲引擎是MyISAM的,則創建一張表,對於三個文件..,如果是Innodb則只有一張文件 *.frm,數據存放到ibdata1)

      *對於 MyISAM 數據庫,需要定時清理optimize table 表名

      因爲,MyISAM表在刪除數據的時候,數據庫文件空間是不會釋放的。需要手動通過 optimize 命令來釋放表空間。

      6. 常見的sql優化手法

      1. 使用order by null 禁用排序
      比如 select * from dept group by ename order by null

      2. 在精度要求高的應用中,建議使用定點數(decimal)來存儲數值,以保證結果的準確性
      1000000.32 萬
      create table sal(t1 float(10,2));
      create table sal2(t1 decimal(10,2));

      7.爲什麼data函數只支持到2038-1-19。跟計算機有關。。。。

      對於32位機器來說,有符號數只能最大支持到 2*31次方-1 這個數次用date計算出來就是2038-1-19.

      8. 表的水平劃分

      9. 其它

      如果你的數據庫的存儲引擎是MyISAM的,則當創建一個表,後三個文件. *.frm 記錄表結構. *.myd 數據 *.myi 這個是索引.

      mysql5.5.19的版本,他的數據庫文件,默認放在 (看 my.ini文件中的配置.)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章