數據庫優化都有哪些?


 一、問題分析

  

  考官主要是對數據庫優化方面的考核,一般數據庫優化分為性能和應用方面的,如你了解 sql 優化嗎;百萬數據怎么優化等

  

  二、 核心答案講解

  

  1、根據服務層面 、配置 mysql 性能優化參數;

  2、從系統層面增強 mysql 的性能 、優化數據表結構、字段類型、字段索引、分表,分庫、讀寫分離等等。

  3、從數據庫層面增強性能 、優化 SQL 語句,合理使用字段索引。

  4、從代碼層面增強性能 、使用緩存和 NoSQL 數據庫方式存儲,如 MongoDB/Memcached/Redis 來緩解高並發下數據庫查詢的壓力。

  5、減少數據庫操作次數,盡量使用數據庫訪問驅動的批處理方法。

  6、不常使用的數據遷移備份,避免每次都在海量數據中去檢索。

  7、提升數據庫服務器硬件配置,或者搭建數據庫集群。

  8、編程手段防止 SQL 注入 、使用 JDBC PreparedStatement按位插入或查詢;正則表達式過濾(非法字符串過濾);

  

  三、問題擴展

 

  1、Sql 優化

  1)應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描;

  2)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如 、select id from t where num is null可以在 num 上設置默認值 0,確保表中 num 列沒有 null值,然后這樣查詢 :

  select id from t where num=0;

  3)很多時候用 exists 代替 in 是一個好的選擇;

  4)用 Where 子句替換 HAVING 子句 因為 HAVING 只會在檢索出所有記錄之后才對結果集進行過濾;

  5)select count(*) from table;這樣不帶任何條件的count 會引起全表掃描,並且沒有任何業務意義,是一定要杜絕的;

  

  2、索引

  1)索引概念 、對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。如果我們把一個表的內容認為是一本字典,那索引就相當於字典的目錄

  

  2)索引類型 :

  Oracle:

  邏輯上 :Single column 單行索引

  Concatenated 多行索引

  Unique 唯一索引

  NonUnique 非唯一索引

  Function-based 函數索引

  Domain 域索引

  物理上:

  Partitioned 分區索引

  NonPartitioned 非分區索引

  B-tree :

  Normal 正常型 B 樹

  Rever Key 反轉型 B 樹

  Bitmap 位圖索引

  MySQL索引分為普通索引、唯一索引、主鍵索引、組合索引、全文索引

  

  3)何時使用索引

  ①主鍵,unique 字段;

  ②和其他表做連接的字段需要加索引;

  ③在 where 里使用>,≥,=,<,≤,is null 和 between

  等字段;

  ④使用不以通配符開始的 like,where A like 'China%';

  ⑤聚集函數 MIN(),MAX()中的字段;

  ⑥order by 和 group by 字段;

 

  4)索引何時失效

  ①組合索引未使用最左前綴,例如組合索引(A,B),where B=b 不會使用索引;

  ②like 未使用最左前綴,where A like '%China';

  ③搜索一個索引而在另一個索引上做 order by,whereA=a order by B,只使用 A 上的索引,因為查詢只使用一個索引 ;

  ④or 會使索引失效。如果查詢字段相同,也可以使用索引。例如 where A=a1 or A=a2(生效),where A=a orB=b(失效)

  ⑤如果列類型是字符串,要使用引號。例如 whereA='China',否則索引失效(會進行類型轉換);

  ⑥在索引列上的操作,函數(upper()等)、or、!=(<>)、not in 等;

  

  四、結合項目中使用

  

  1.常用但不經常修改的字段建索引(譬如商品表的商品名稱等字段),達到檢索速度增快,用戶體驗度增高的目的

  2.用 mycat 進行分庫分表

  垂直拆分是基於數據庫中的"列"進行,某個表字段較多,可以新建一張擴展表,將不經常用或字段長度較大的字段拆分出去到擴展表中。例如用戶表,在字段很多的情況下(例如一個大表有 100 多個字段),通過"大表拆小表",更便於開發與維護,也能避免跨頁問題

  水平分表

  水平切分分為庫內分表和分庫分表,是根據表內數據內在的邏輯關系,將同一個表按不同的條件分散到多個數據庫或多個表中,每個表中只包含一部分數據,從而使得單個表的數據量變小,達到分布式的效果(如訂單表)

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM