1、創建索引html
普通索引 index: 對關鍵字沒有要求。mysql
惟一索引 unique index: 要求關鍵字不能重複。同時增長惟一約束。算法
主鍵索引 primary key: 要求關鍵字不能重複,也不能爲NULL。同時增長主鍵約束。sql
全文索引 fulltext key: 關鍵字的來源不是全部字段的數據,而是從字段中提取的特別關鍵詞。緩存
索引的管理:架構
- 建表時
- 更新表結構
一、前綴索引優化
創建前綴索引的語法:spa
alter table test add KEY (name(5));
name必定是字符類型(索引字段),5爲長度3d
那好,如何肯定取前面幾個字符呢?顯然,這個場景是一個觀察的結果,也就是說,必需要有必定量的實際數據,咱們才能分析出其規律,也就是說這個索引是在後期優化得來的,前期不必創建。日誌
- 計算不重複的機率:
select COUNT(DISTINCT name) / COUNT(*) as rate from test;
- 找出接近rate的一個n(試出最合理的n)
select COUNT(DISTINCT LEFT(name, 3)) / COUNT() as rate3 from test; select COUNT(DISTINCT LEFT(name, 5)) / COUNT() as rate5 from test; select COUNT(DISTINCT LEFT(name, 7)) / COUNT() as rate7 from test; select COUNT(DISTINCT LEFT(name, 9)) / COUNT() as rate9 from test; select COUNT(DISTINCT LEFT(name, 11)) / COUNT() as rate11 from test; select COUNT(DISTINCT LEFT(name, 15)) / COUNT() as rate15 from test; select COUNT(DISTINCT LEFT(name, 20)) / COUNT(*) as rate20 from test; …
二、全文索引
該類型的索引特殊在:關鍵字的建立上。爲了解決 like ‘%keyword%’這類查詢的匹配問題。
查詢 標題或者內容包含 database 關鍵字的記錄。
造成的SQL以下:
Select * from articles where title like ‘%database%’ or body like ‘%database%’;
此時須要創建全文索引
直接使用上面的SQL:
須要使用特殊的全文索引匹配語法才能夠生效:
Match() against();
注意:mysql提供的全文索引不能對中文起做用,能夠採用Sphinx索引引擎。
Match() against() ,返回的關鍵字的匹配度(關鍵字與記錄的關聯程度)。
三、Explain 執行計劃
能夠經過在select語句前使用 explain,來獲取該查詢語句的執行計劃,而不是真正執行該語句。
2、查詢緩存(query_cache)
查看緩存配置:
開啓並設置大小:
注意事項:
一、嚴格保證SQL一致,區分大小寫等。
二、 若是查詢時包含動態數據,則不能被緩存。
三、一旦開啓查詢緩存,MySQL會將全部能夠被緩存的select語句都緩存。若是存在不想使用緩存的SQL執行,則可使用 SQL_NO_CACHE語法提示達到目的。
3、分區
一、分區語法
Create table table_name (
定義
)
Partition by 分區算法 (參數) 分區選項。
注意:分區與存儲引擎無關,是MySQL邏輯層完成的。
經過變量查看當前mysql是否支持分區:
分區算法:
MySQL提供4種
取餘:Key,hash
條件:List,range
提示,參與分區的參數字段須要爲主鍵的一部分。
- key - 按照某個字段進行取餘
-
Hash - 按照某個表達式的值進行取餘
注意:Key,hash都是取餘算法,要求分區參數,返回的數據必須爲整數。
-
List - 須要指定的每一個分區數據的存儲條件
- Range - 條件依賴的數據是一個條件表達式
二、管理分區語法
- 取餘:key和hash
增長分區數量:
減小分區數量:
採用取餘算法的分區數量的修改,不會致使已有分區數據的丟失,須要從新分配數據到新大地分區。
- 條件:List和Range
添加分區:
刪除分區:
注意:刪除條件算法的分區,致使分區數據丟失。
4、分表
一、水平分表案例
建立結構相同的N個表:
再建立用於管理學生ID的表:
PHP客戶端邏輯:
二、垂直分表
表中存在多個字段。
經常使用字段 - 很是有字段
主要目的,減小每條記錄的長度。
例如學生表能夠分紅:
基礎表和額外表,兩張表中記錄爲1:1的關係。
案例:
基礎信息表
Student_base
Id name age
額外信息表
Student_extra
Id 籍貫 政治面貌
5、架構層面
6、SQL語句
將複雜的SQL拆分屢次執行。
案例:
商品,分類:
Select * from category;分類列表
Select cat_id, count(*) from goods group by goods;分類對應的商品數量。
分頁
Limit offset, size;
Size = 10;
Page |
offset |
5 |
40, 10 |
50 |
490, 10 |
5000 |
4990, 10 |
500000 |
499990, 10 |
Limit 的使用,會大大提高無效數據的檢索(被跳過)。
應該使用條件等過濾方式,將檢索到的數據儘量精肯定位到須要的數據上。
例如分頁:
Limit size;
7、慢查詢日誌
查看慢查詢日誌:
開啓日誌:
日誌信息以下: