PHP 之Mysql優化

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、慢查詢日誌

查看慢查詢日誌:

開啓日誌:

 日誌信息以下:

相關文章
相關標籤/搜索