[TOC]
## 字段類型
### 字段類型的選擇
#### 選擇合理范圍內最小的
我們應該選擇最小的數據范圍,因為這樣可以大大減少磁盤空間及磁盤I/0讀寫開銷,減少內存占用,減少CPU的占用率。
#### 選擇相對簡單的數據類型
數字類型相對字符串類型要簡單的多,尤其是在比較運算是,所以我們應該選擇最簡單的數據類型,比如說在保存時間時,因為PHP可以良好的處理LINUX時間戳所以我們可以將日期存為int(10)要方便、合適、快速的多。
#### 不要使用null
為什么這么說呢,因為MYSQL對NULL字段索引優化不佳,增加更多的計算難度,同時在保存不處理NULL類形時,也會做更多的工作,所以從效率上來說,不建議用過多的NULL。有些值他確實有可能沒有值,怎么辦呢?解決方法是數值弄用整數0,字符串用空來定義默認值即可。
#### 字符串類型的使用
字符串數據類型是一個萬能數據類型,可以儲存數值、字符串等。
保存數值類型最好不要用字符串數據類型,這樣存儲的空間顯然是會更大,而且在排序時字符串的9是大于22的,其實如果進行運算時mysql會將字符串轉換為數值類型,大大降低效果,而且這種轉換是不會走原有的索引的。
如果明確數據在一個完整的集合中如男,女,那么可以使用set為enum數據類型,這種數據類型在運算及儲存時以數值方式操作,所 以效率要比字符串更好,同時空間占用更少
### 數值類型的選擇
整數類型很多比如tinyint、int、smallint、bigint等,那么我們要根據自己需要存儲的數據長度決定使用的類型,同時tinyint(10)t和 tinyint(100)在儲存不計算上并無任何差別,區別只是顯示層面上,但是我們也要選擇適合合適的數據類型長度。可以通過指定zerofill 屬性查看顯示時區別。
浮點數float和double在儲存空間及運行效率上要優于精度數值類型decimal,但float不double會有舍入錯誤而decimal則可以提供更加準確的小數級精確運算不會有錯誤產生計算更精確,適用于金融類型數據的存儲。
數值數據類型要比字符串執行更快,區間小的數據類型占用空間更少,處理速度更快,如tinyint可比bigint要快的多選擇數據類型時要考慮內容長度,比如是保存毫米單位還是米而選擇不同的數值類型
## 數據庫表設計
### 水平分表
#### 按時間分表
這種分表方式有一定的局限性,當數據有較強的實效性,如微博發送記錄、微信消息記錄等,這種數據很少有用戶會查詢幾個月前的數據,如就可以按月分表。
#### 按區間范圍分表
把數據分到不同的表格中
<table >
<tbody><tr>
<td>table_1</td>
<td>user_id從1~100w</td>
</tr>
<tr>
<td>table_2</td>
<td>user_id從100w~200w</td>
</tr>
<tr>
<td>table_3</td>
<td>user_id從200w~300w</td>
</tr>
</tbody></table>
### 垂直分表
一張表的字段過多的時候,我們可以把表垂直進行拆分,把不經常用的字段或者不經常查詢的字段把到另外一張表,當擴展表用。需要的時候再聯表查詢。
## 查詢
### 減少IO
根據業務的需求來獲取想要的數據,盡量少使用*號,不要返回用不到的任何字段
對一些不常更新的數據,可以采用緩存的方式,避免過多的查詢
對頻繁插入的數據,也可以緩存的方式,避免頻繁的寫入操作。如瀏覽量
在Join表的時候使用相當類型的例
### 索引
MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。 打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車。
索引就像一本書的目錄一樣,我們可以通過一本書的目錄,快速的 找到需要的頁面,但是我們也不能過多的創建目錄頁,原因是如果 某一篇文章刪除或修改將發變所有頁碼的順序,就需要重新創建目 錄
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。 創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄。 上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。 建立索引會占用磁盤空間的索引文件。
## explain
EXPLAIN可以幫助開發人員分析SQL問題,explain顯示了mysql如何 使用索引來處理select語句以及連接表,可以幫助選擇更好的索引和 寫出更優化的查詢語句。
**全表查詢**

**根據某個有索引的字段進行查詢**

## 定位慢查詢
當Mysql性能下降時,通過開啟慢查詢來獲得哪條SQL語句造成的響應過 慢,進行分析處理。當然開啟慢查詢會帶來CPU損耗和日志記錄的IO開銷, 所以我們要間斷性的打開慢查詢日志來查看Mysql運行狀態。
查詢能記錄下所有執行超過long_query_time時間的SQL語句, 用于找 到執行慢的SQL, 方便我們對這些SQL進行優化.
### 是否開啟慢查詢
~~~
show variables like "%slow%";
~~~
### 查詢慢查詢SQL狀況
~~~
show status like "%slow%";
~~~
### 慢查詢時間
~~~
show variables like "long_query_time"
~~~
### 開啟記錄慢查詢
修改mysql配置文件my.ini加入
~~~
slow_query_log = on;
slow_query_log_file = /data/f/mysql_slow_xbs.log
long_query_time = 2
//測試執行一條慢查詢
mysql>select sleep(3);
~~~
- 序言
- 第一章:準備工作
- 寫在學習之前的話
- web應用開發結構
- 開發工具/環境
- 第二章:展現層面(HTML/CSS)
- HTML簡介
- HTML基礎
- HTML編碼
- HTML鏈接
- HTML圖像
- HTML列表
- HTML表單
- HTML表格(分水嶺)
- HTML 實體
- HTML框架
- CSS層疊樣式表
- CSS選擇器
- CSS文本/字體
- CSS繼承和疊加
- CSS框模型
- CSS浮動(分水嶺)
- CSS定位
- CSS背景
- CSS圖標字體
- CSS補充
- 開發技巧
- 第三章:展現層面(Javascript)
- JS簡介
- JS實現
- JS輸出交互
- JS變量
- JS數據類型
- JS運算符
- JS流程控制(分水嶺)
- JS函數
- JS數組
- JS對象(分水嶺)
- JS數組對象
- JS字符串對象
- JS數學對象
- JS日期對象
- JS BOM對象(分水嶺)
- JS DOM對象
- JS事件對象
- JS元素對象
- JS DOM節點
- 第四章:展現層面(Jquery)
- JQ簡介
- JQ使用
- JQ選擇器
- JQ篩選
- JQ屬性
- JQ-CSS
- JQ事件
- JQ文檔處理
- JQ效果
- JQ-ajax
- 第五章:邏輯/業務層面(PHP)
- PHP簡介
- PHP變量
- PHP數據類型
- PHP常量
- PHP運算符
- PHP流程控制
- PHP函數(分水嶺)
- PHP日期
- PHP數學
- PHP數組
- PHP字符串
- PHP正則表達式(分水嶺)
- PHP目錄操作
- PHP文件
- PHP上傳/下載
- PHP面向對象(分水嶺)
- PHP圖像處理
- PHP會話控制
- Ajax異步處理
- PHPMysql擴展
- PHPMysqli擴展
- PHPPdo擴展
- PHP接口
- PHP命名空間
- 第六章:邏輯/業務層面(框架設計)
- 第七章:存儲層面(mysql)
- Mysql基礎
- Mysql Sql簡介
- Mysql數據庫
- Mysql數據類型
- Mysql數據表
- Mysql操作記錄
- Mysql查詢
- Mysql修改表結構
- Mysql日期與時間
- Mysql分組統計
- Mysql多表查詢
- Mysql安全
- Mysql存儲引擎
- Mysql事務
- Mysql視圖
- Mysql觸發器
- Mysql存儲過程
- Mysql存儲函數
- Mysql優化
- 第八章:服務器(Linux)
- Linux介紹與安裝
- Shell
- 目錄與文件操作
- VIM編輯器使用
- 帳號管理
- SUDO
- 權限控制
- 壓縮與打包
- 軟件安裝
- 計劃任務
- 進程管理
- 寶塔Linux面板