從今天開始,在這裡記錄面試會問的問題,針對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檔案大小不會減小