合理選擇表字段型別型別
int
型別優先於varchar
型別 優先於text
型別
varchar
(變長字串)型別優先於char
(不可變長)型別
表分割:對於頻繁使用的且資料量增長很快的表進行表的分割
水平分割:當一張表資料量非常大影響效率時,可將表中的資料按一定的演算法將其進行水平方向(行)的分割,如對user 表進行水平分割時,可將user表中的資料,按照一定的規則如對userid 尾數取模,將一些資料放入user1,一些放入user2, 而user1和user2 這兩張表的結構是一樣的。
垂直分割:將表進行垂直方向的分割,根據資料的活躍度(被使用程度)將表分為主表、次表等等。主表為活躍度較高的資料。因此分割前要對系統資料活躍度進行調查。將一張大表分割為主表、次表,可縮小、精確查詢範圍,從而達到優化查詢的目的。從字段列方向對錶進行分割,對錶進行**,刪除冗餘欄位或不常用字段,將這些字段放到其他表中,當需要時連線查詢得到需要的資料。
建立並正確使用索引,避免查詢放棄使用索引,進行全表掃瞄 (以下操作結果基於 mysql5.7)
避免在索引欄位上使用 is null 和 is not null ——》字段盡量不要允許為null 可以用0或其他特殊字元代替
避免在索引欄位上使用 != 、 <> 和not in
避免在where子句中對乙個有索引的字段和乙個沒有索引的字段使用or連線如 :select * from person where name = 'xjn' or age = 19;
其中 name 有索引,age 無索引,該查詢將會全表掃瞄。 可用union all
等連線查詢代替or
連線查詢 如select * from person where name = 'xjn' union all select * from person where age = 19;
避免使用前導模糊查詢 如 like 』%ab%『
避免對索引字段進行表示式或者函式操作 如:select * from person where name + 18 = 50;
,select * from person where substring(name,1,3) = 'abc'
避免對索引字段使用變數,通常在儲存過程中會定義變數,一般情況下不怎麼會用到變數。
組合索引的順序也會影響到索引的使用情況,從而影響到查詢效率
避免索引欄位的查詢條件進行型別轉換 如:select * from person where name = 50;
name
屬性為varchar
型別,使用數字型別作為查詢條件時,會隱式的在字段上使用型別轉換函式從而索引將失效。
盡量縮小精確查詢範圍,避免全表掃瞄
減少返回的資料量(分頁),避免返回大量無用資料,從而減少網路傳輸和磁碟訪問
優先考慮使用連線查詢(連線查詢優先於巢狀查詢)
使用儲存過程,但是不便於維護
explain
關鍵字輸出sql語句執行的情況,可以檢視到哪些sql語句是全表搜尋,或者使用了什麼索引。
斷點執行可以看出哪段**執行過慢(很慢的情況下)。從而定位到查詢效率低的問題。
參考學習** :
mysql 資料庫查詢優化
從上圖可以看出,計算機系統硬體效能從高到代依次為 cpu cache l1 l2 l3 記憶體 ssd硬碟 網路 硬碟 根據資料庫知識,我們可以列出每種硬體主要的工作內容 cpu及記憶體 快取資料訪問 比較 排序 事務檢測 sql解析 函式或邏輯運算 網路 結果資料傳輸 sql請求 遠端資料庫訪問 ...
mysql資料庫查詢優化
上兩周一直想辦法提高查詢速度,取得一點效果,解決了部分問題,記下來以便將來自己檢視。由於公司沒有專門的dba,我自己對mysql資料庫也不是很熟悉,而且這個j a開發的網路審計系統的管理系統,是經過了n多人幾年時間的修修改改,今天到我們手裡,要改成能支援大流量情況的版本,所以對我們這個只有幾個人的j...
mysql 查詢優化器 資料庫查詢優化器
所謂查詢優化,目標是關聯式資料庫下或者 newsql 的 sql server 層對 sql 語句進行優化,在不改變期望結果的情況下使得資料庫引擎計畫執行時間最短。狹義的查詢優化技術是指邏輯優化與物理優化 在後面會細講 廣義上的查詢優化技術包括從 sql 語句輸入開始,對 sql 語句的重寫,內部執...