專題《一》 mysql優化

x號開發者發表於2019-03-17

從今天開始,在這裡記錄面試會問的問題,針對java高階開發,架構師方向。

 

1.資料庫設計要合理。開發經驗不同  設計表水平不同  影響後面操作

  三正規化:1------------原子約束,每列不可分割                           具體看業務,比如地址

      2------------主鍵唯一

      3------------不要有冗餘資料

 

 

2.新增索引(普通   index,主鍵   primary·,唯一  unsigned,全文,

      組合索引   alter table dept add index my_ind (dname,loc); )                                 mysql優化,重點索引優化

 折半查詢

mysql----mysql  server5.5----data---資料庫名---每個資料庫有      MYD表資料     MYI索引檔案    frm表結構   三個檔案

 

底層:b+樹               將索引排列成樹的結構。   選取一箇中間數,小的總是在左邊,大的總是在右邊

    2的n次方查詢速度。    比如2的5次方個資料,只需要查詢5次。

 

缺點:增加,刪除,索引檔案需要更新。

 

MySql提供了EXPLAIN語法用來進行查詢分析,在SQL語句前加一個"EXPLAIN"即可。比如我們要分析如下SQL語句:

explain select * from table where table.id = 1 

執行上面的sql語句後你會看到,下面的表頭資訊:

table | type | possible_keys | key | key_len | ref | rows | Extra

 

總結:滿足一下條件的欄位,才應該建立索引

①  肯定在where條件經常使用

②  該欄位的內容不是唯一的幾個值

③  欄位內容不是頻繁變化

 

實際企業中不會使用全文索引:

 第三方搜尋引擎框架:es,slor

 

3.分表分庫(分表:減輕單張表壓力   分庫:根據專案分庫)

分表:根據年限,尾數,     取模根據尾數

 

 

4.讀寫分離

 篇幅較多,在下一篇闡述

 

 

5.儲存過程   ( 就是一塊sql語句,提升執行效率,但是靈活性不高)

 

6.配置mysql最大連線數

 

7.mysql伺服器硬體升級

 

8.隨時清理碎片化

 

9.sql語句調優

 

①  使用group by 分組查詢是,預設分組後,還會排序,可能會降低速度,

在group by 後面增加 order by null 就可以防止排序.

explain select * from emp  group by deptno order by null;

②  有些情況下,可以使用連線來替代子查詢。因為使用join,MySQL不需要在記憶體中建立臨時表。

select * from dept, emp where dept.deptno=emp.deptno; [簡單處理方式]

select * from dept left join emp on dept.deptno=emp.deptno;  [左外連線,更ok!]

 

 

③  對查詢進行優化,要儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

應儘量避免在 where 子句中對欄位進行 null 值判斷

 

模糊查詢在like前面有百分號開頭會失效。

 

如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有欄位,都必須建立索引, 我們建議大家儘量避免使用or 關鍵字

 

 

 

 

10.定位慢查詢

 mysql預設慢查詢10s

//顯示慢查詢次數

show status like 'slow_queries';

--查詢慢查詢時間

show variables like 'long_query_time';

--修改慢查詢時間

set long_query_time=1; ---但是重啟mysql之後,long_query_time依然是my.ini中的值

 

 

如何將慢查詢位到日誌中

 

在預設情況下,我們的mysql不會記錄慢查詢,需要在啟動mysql時候,指定記錄慢查詢才可以

 

 

bin\mysqld.exe --safe-mode  --slow-query-log [mysql5.5 可以在my.ini指定](安全模式啟動,資料庫將操作寫入日誌,以備恢復)

 

 

bin\mysqld.exe log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

 

先關閉mysql,再啟動, 如果啟用了慢查詢日誌,預設把這個檔案放在

 

 

my.ini 檔案中記錄的位置:

 

#Path to the database root

 

datadir=" C:/ProgramData/MySQL/MySQL Server 5.5/Data/"

 

 

mysql儲存引擎

inndb(主流),        ------------事務機制

myisam,

memory

 

MyISAM 和 INNODB的區別

1. 事務安全(MyISAM不支援事務,INNODB支援事務)

2. 查詢和新增速度(MyISAM批量插入速度快)

3. 支援全文索引(MyISAM支援全文索引,INNODB不支援全文索引)

4. 鎖機制(MyISAM時表鎖,innodb是行鎖)

5. 外來鍵 MyISAM 不支援外來鍵, INNODB支援外來鍵. (在PHP開發中,通常不設定外來鍵,通常是在程式中保證資料的一致)

Memory 儲存,比如我們資料變化頻繁,不需要入庫,同時又頻繁的查詢和修改,我們考慮使用memory, 速度極快. (如果mysql重啟的話,資料就不存在了)

 

如果你的資料庫的儲存引擎是myisam,請一定記住要定時進行碎片整理:具體表現為清除資料後,myd檔案大小不會減小

 

相關文章