資料庫優化策略小結
一、資料型別的優化
(1)MySQL資料型別
- 整數型別:
- TinyInt,儲存空間8, 位元組長度1;
- SmallInt, 儲存空間16, 位元組長度2;
- MediumInt,儲存空間24, 位元組長度3;
- Int,儲存空間32, 位元組長度4;
- BigInt,儲存空間64, 位元組長度8;
- 實數型別:
- Float:位元組長度8,單精度浮點數;
- Double:位元組長度16,雙精度浮點數;
- Decimal:未打包的浮點數,計算中會轉化為Double;Decimal 相比於 Float 和 Double 需要額外的空間和計算開銷,因此儘量只在對小數進行精確計算時才使用,例如儲存財務資料。在資料量比較大的時候,可以考慮使用 BigInt 代替 Decimal,將需要儲存的貨幣單位根據小數的位數乘以相應的倍數即可。
- 字串型別:
- VarChar:儲存可變長字串,需要一個或兩個額外位元組記錄字串長度。適用於:字串列的最大長度比平均長度大很多;列的更新很少(所以碎片不是問題);使用了UTF-8這樣複雜的字符集,每個字元都使用不同的位元組數進行儲存。
- Char:定長,根據定義的字串長度分配足夠的空間。Char 適合儲存很短的字串,或者所有值都接近同一個長度。如:儲存密碼的MD5值(這是一個定長的值);經常變更的資料(定長的 Char 型別不容易產生碎片);非常短的列,比如用 char(1) 來儲存只有Y和N的值,如果採用單位元組字符集只需要一個位元組,但是 varchar(1) 卻需要兩個位元組(還有一個記錄長度的額外位元組)。
- 時間型別
- DATETIME:使用8位元組儲存空間,將日期和時間裝到格式為YYYYMMDDHHMMSS的整數中;
- TIMESTAMP:使用4位元組儲存空間,顯示的值依賴於時區。儘量使用它,因為它的空間效率更好。
(2)優化策略
- 更小的通常更好
- 更小的通常更快,因為它佔用更小的磁碟、記憶體和cpu快取,且處理時需要的cpu週期更小;
- 但是要確保沒有低估需要儲存的值的範圍。
- 簡單就好
- 簡單的資料型別操作需要更少的cpu處理週期;
- 如:整型比字串代價更低、MySQL內建型別(date,time,datetime)而非字串來儲存時間、用整型儲存IP地址。
- 儘量避免使用NULL
- 通常最好指定列為NOT NULL,除非真的需要儲存NULL值;
- 因為如果查詢中包含可為 NULL 的列,對 MySQL 來說更難優化,因為可為 NULL 的列使得索引、索引統計和值比較都更復雜;可為 NULL 的列會使用更多的儲存空間,在MySQL裡也需要特殊處理;當可為 NULL 的列被索引時,每個索引記錄需要一個額外的位元組。
二、索引優化
(1)索引型別
- B-Tree索引:
- 通常意味著所有值按順序儲存,並且每一個葉子葉到根的距離相等;
- 能加快訪問速度,因為儲存引擎不需要全表掃描來捕獲需要的資料,而是從索引的根節點開始進行搜尋;
- 對索引順序儲存,所以很適合查詢範圍資料
- B-Tree索引有效的查詢型別:
- 全值匹配:和索引中所有列進行匹配;
- 匹配最左字首:只使用索引第n列匹配;
- 匹配列字首:只匹配某一列值的開頭部分;
- 匹配範圍值:某一列在xx和xxx之間的值;
- 精確匹配某一列,範圍匹配另一列:某一列全匹配,另一列範圍匹配;
- 只訪問索引的查詢:只訪問索引,不訪問資料行。
- B-Tree索引的限制:
- 如果不是按照索引的最左列查詢,則無法使用索引;
- 不能跳過索引中間的列;
- 如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引優化查詢;(如果範圍查詢有限,建議使用多個等於代替範圍查詢)。
- 雜湊索引:
- 基於雜湊表實現,只有精確匹配索引所有列的查詢才有效;
- 對於每一行資料,儲存引擎都會對所有索引列計算一個雜湊碼,雜湊索引將所有雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標;
- 雜湊索引的限制:
- 只包含雜湊值和行指標,不儲存欄位,所以不能使用索引中的值避免讀取行;
- 不是按索引值順序儲存,所以不能排序;
- 不支援部分索引列匹配查詢;
- 訪問雜湊索引的速度非常快,除非出現很多雜湊衝突,出現很多雜湊衝突的話,一些索引維護的代價非常大;
- 雜湊索引的應用:
- InnoDB“自適應雜湊索引”:某些索引值被引用的非常頻繁,他會在記憶體中基於B-Tree索引的基礎上建立一個雜湊索引。
(2)高效能索引策略:
- 索引的優點:
- 索引可以大大減少資料庫表的掃描量
- 索引可以幫助伺服器避免排序和臨時表
- 索引可以將隨機I/O變成順序I/O
索引選擇:
- 字首索引:使得索引更小,更快(比如要索引很長的字串),但是無法做GROUP BY和ORDER BY操作,也無法覆蓋掃描;
- 索引列順序:經驗法則是將選擇性最高的放在最前面;
聚簇索引:實際上是一種資料的儲存方式
- 資料航存放在索引的葉子結點,且資料行和相鄰的鍵值緊湊地存放在一起
- 優點:
- 可以將相關資料儲存在一起,減少磁碟I/O
- 索引和資料儲存在一個B-Tree,資料訪問更快
- 使用覆蓋索引的掃描時可以直接使用主鍵
- 缺點:
- 插入速度依賴於插入順序,最好是按照主鍵順序插入
- 更新列代價很高
- 插入行可能導致頁分裂
三、查詢優化
(1)優化資料訪問
- 避免查詢不需要的記錄:使用limit;
- 避免多表查詢查詢所有列:不要隨意使用select * ;
- 重複查詢相同資料:採用快取;
(2)從好到壞的where條件應用
- 最佳:儲存引擎層在索引中使用where過濾不匹配的記錄
- 次佳:使用索引覆蓋掃描,直接從索引中過濾不需要的記錄並返回,在伺服器層完成
- 最次:先從資料表中返回資料,然後過濾,需要回表查詢
(3)重構查詢
- 一個複雜查詢改為多個簡單查詢
- 切分查詢:
- 對大查詢“分而治之”,減少鎖持有的時間
- 例如刪除過期記錄,每次LIMIT 10000,否則可能一次鎖住很多資料,佔滿整個事務日誌,耗盡系統資源,阻塞很多小但是重要的查詢;
- 分解關聯查詢:
- 讓快取效率更高;
- 減少鎖的競爭;
- 應用層關聯便於表的拆分,更容易做到高效能和可擴充套件;
- 減少冗餘記錄查詢;
參考文獻:《高效能MySQL》
相關推薦
資料庫優化策略小結
一、資料型別的優化 (1)MySQL資料型別 整數型別: TinyInt,儲存空間8, 位元組長度1; SmallInt, 儲存空間16, 位元組長度2; MediumInt,儲存空間
資料庫優化策略(二)
1、要合理使用索引索引是資料庫一個重要的構成部分,很多人都會忽略它,其實索引的根本目的就是為了提高查詢效率。使用原則如下: 在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的欄位則由優化器自動生成索引。 在頻繁進行排序或分組(即進行group by或orde
webpack前段構建效能優化策略小結
const webpack = require('webpack'); const path = require('path'); const isDebug = process.env.NODE_ENV === 'development'; const outputPath = isDebug
mysql資料庫優化小結
一、常見資料庫的優化操作 1、表的設計要符合三正規化。 2、新增適當的索引,索引對查詢速度影響很大,必須新增索引。主鍵索引,唯一索引,普通索引,全文索引 3、新增適當儲存過程,觸發器,事務等。 4、讀寫分離(主從資料庫) 5、對sql語句的一些優化,(查詢執行速度比較慢的sql語
【資料庫】索引優化策略
索引優化策略 關於什麼是索引,如何建立索引,索引的優缺點等,請移步我的另外一篇文章mysql索引簡談 一、為什麼要建立索引? 一句話,為了加快查詢效率。注意這裡的“查詢”,而不是增
資料庫邏輯層優化策略
1、儘可能的早做選擇和投影,可使中間結果變小,節省幾個數量級的時間 2、把選擇和投影串接起來,一元運算序列可以一起執行,只需對整個關係掃描一遍 3、把投影與其前或後的二元運算結合起來,在第一次用關係時去掉一些屬性,可以避免多次掃描整個關係 4、把某些選擇與其前的笛卡兒積合併成一個連線,當R*S有選擇運算且其中
Mysql資料庫優化系列(五)------索引優化策略之面試題
實驗: Type:range 此處使用上了範圍索引 Key_len:12/3=4列 使用到了索引c1,c2,c3,c4.解析:因為order by c3是有序的,所以c3,c4也用到了索引 上圖用到了c1,c2,c3,order by有序,可以利用索引。 上圖
Oracle10g資料庫優化實用心得小結
很多的時侯,做Oracle DBA的我們,當應用管理員向我們通告現在應用很慢、資料庫很慢的時侯,我們到資料庫時做幾個示例的Select也發現同樣的問題時,有些時侯我們會無從 下手,因為我們認為資料庫的各種命種率都是滿足Oracle文件的建議。實際上如今的優化己經向優化等待
資料庫效能優化策略
有資料表明:使用者可以承受的最大等待時間為8秒。 之前曾見過某個產品的一個列表頁,40秒左右才能加載出來,幾乎沒有進行任何優化措施。 沒有索引,沒有快取機制,沒有進行sql優化(sql語句很長,並且各種left join表關聯)。 資料庫優化策略有很多
IOS經常使用的性能優化策略
art ng- data ios 及其 insert zip 查找 ray 1、用ARC管理內存 2、對於UITableView使用重用機制 3、UIView及其子類設置opaque=true 4、主進程是用來繪制UI的,所以不要堵塞 5、慎用XIB,由
數據庫性能優化策略
維護 什麽 影響 長度 bsp 好的 都沒有 垂直 arch 有數據表明:用戶可以承受的最大等待時間為8秒。 之前曾見過某個產品的一個列表頁,40秒左右才能加載出來,幾乎沒有進行任何優化措施。 沒有索引,沒有緩存機制,沒有進行sql優化(sql語句很長,並且各種left j
常見性能優化策略的總結(轉)
觸發 air 技術 敏捷 返回 好的 依賴 pan 支付 看到一篇好文,轉過來好好學習 閱讀目錄 代碼 數據庫 緩存 異步 NoSQL JVM調優 多線程與分布式 度量系統(監控、報警、服務依賴管理) 案例一:商家與控制區關系的刷新job 案例二:POI緩存設計與實現
SEO之網站頁面優化策略
網站 層次 css代碼 排名算法 什麽 較高的 自己的 指標 就是 網站的頁面優化,也即網頁優化是對網頁的程序、內容、版塊、布局等多方面的優化調整,使其適合搜索引擎檢索,滿足搜索引擎排名的指標,從而在搜索引擎檢索中獲得的排名提升,增強搜索引擎營銷的效果使網站的產品相關的關鍵
SEO之網站內鏈優化策略
內部 應該 分頁 個數字 最好的 www. 體驗 網站導航 穩定 內部鏈接的首要目的就是提高網站的整體收錄,提升鏈接目的頁面的排名,對網站整體的流量能起到顯著的優化。一個網站的收錄量如果穩定並且持續增加,則意味著至少這個網站的內部鏈接處理得較為到位。 內鏈優化的方法和原
【Hive】優化策略
nap set 進行 類型 命令 part ado http 計劃 Hive對於表的操作大部分都是轉換為MR作業的形式,為了提高OLAP[online analysis process 在線分析處理]的效率,Hive自身給出了很多的優化策略 1. explain[解釋執行計
mysql 優化策略(如何利用好索引)
i/o 建立索引 lar .net https 壓縮 oracle 包括 analyze 命名規則:表名_字段名1、需要加索引的字段,要在where條件中2、數據量少的字段不需要加索引3、如果where條件中是OR關系,加索引不起作用4、符合最左原則https://segm
Mysql優化策略
整型 time nbsp lai explain 性別 lec myisam length 一、建表原則: 1、表的優化與類型選擇 (1)定長與變長相分離。 (2)根據使用頻率建立主表及副表(將不常用的字段放入副表中:比如用戶表,將用戶家庭地址等詳細信息放入附表,當
MySQL的SQL執行性能分析以及性能優化策略和步驟
itl com pos url sql href class 分析 www. MySQL 的性能(下篇)—— 性能優化方法MySQL的SQL執行性能分析以及性能優化策略和步驟
uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結)
設計 cnblogs 高效 基於 復雜 時間復雜度 出現一次 去除 算法設計 uva 1608 不無聊的序列(附帶常用算法設計和優化策略總結) 紫書上有這樣一道題: 如果一個序列的任意連續子序列中都至少有一個只出現一次的元素,則稱這個序列時不無聊的。輸入一個n個元素的序列
前端性能優化(一):桌面瀏覽器前端優化策略
data lan ucc 靜態 sync 怎樣 拆分 打包成 pan 摘要: 前端性能優化是一個很寬泛的概念,本書前面的部分也多多少少提到一些前端優化方法,這也是我們一直在關註的一件重要事情。配合各種方式、手段、輔助系統,前端優化的最終目的都是提升用戶體驗,改善頁面性能,我