mysql為何要進行優化:
mysql優化是乙個綜合性的技術,主要包括:
要保證資料庫的效率,要做好以下四個方面的工作
通俗地理解三個正規化
第一正規化: 1nf是對屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關係型資料庫都滿足1nf)
第二正規化: 2nf是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三正規化: 3nf是對字段冗餘性的約束,它要求字段沒有冗餘。 沒有冗餘的資料庫設計可以做到。
第一正規化(1nf)
1. 即表的列的具有原子性,不可再分解,即列的資訊,不能分解, 只要資料庫是關係型資料庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1nf。
2. 資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。
3. 如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即乙個欄位只儲存一項資訊。
第二正規化(2nf)
1、要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要我們設計乙個主鍵來實現(這裡的主鍵不包含業務邏輯)。
第三正規化(3nf)
1、要求乙個資料庫表中不包含已在其它表中已包含的非主鍵字段。
2、如果能夠被推導出來,就不應該單獨的設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。
3、很多時候,我們為了滿足第三正規化往往會把一張表分成多張表。
mysql優化的一般步驟:
通過show status命令了解各種sql的執行頻率
定位執行效率較低的sql語句-(重點select)
通過explain分析低效率的sql語句的執**況
explain使用舉例
explain select *
from emp where ename=「wsrcla」
會產生如下資訊:
select_type: 表示查詢的型別。
table: 輸出結果集的表
type
: 表示表的連線型別
possible_keys: 表示查詢時,可能使用的索引
key: 表示實際使用的索引
key_len: 索引欄位的長度
rows: 掃瞄出的行數(估算的行數)
extra: 執**況的描述和說明
explain資訊詳解
1
.id select識別符。這是select的查詢序列號
2. select_type
primary : 子查詢中最外層查詢
subquery : 子查詢內層第乙個select,結果不依賴於外部查詢
dependent subquery: 子查詢內層第乙個select,依賴於外部查詢
union : union語句中第二個select開始後面所有select,
******: 簡單的 select 查詢,不使用 union 及子查詢
union : union 中的第二個或隨後的 select 查詢,不依賴於外部查詢的結果集
3. table : 顯示這一步所訪問資料庫中表名稱
4. type : 對錶訪問方式
all: select * from emp \g 完整的表掃瞄 通常不好
select * from (select * from emp where empno =
1) a ;
system: 表僅有一行(
=系統表)。這是const聯接型別的乙個特
const: 表最多有乙個匹配行
5. possible_keys : 該查詢可以利用的索引,如果沒有任何索引顯示 null
6. key : mysql 從 possible_keys 所選擇使用索引
7. rows : 估算出結果集行數
8. extra查詢細節資訊
no tables : query語句中使用from dual 或不含任何from子句
using filesort : 當query中包含 order by 操作,而且無法利用索引完成排序,
impossible where noticed after reading const tables: mysql query optimizer 通過收集統計資訊不可能存在結果
using temporary: 某些操作必須使用臨時表,常見 group by ; order by
using where: 不用讀取表中所有資訊,僅通過索引就可以獲取所需資料;
字段型別轉換導致不用索引,如字串型別的不用引號,數字型別的用引號等,這有可能會用不到索引導致全表掃瞄
mysql 不支援函式轉換,所以字段前面不能加函式,否則這將用不到索引
不要在字段前面加減運算
字串比較長的可以考慮索引一部份減少索引檔案大小,提高寫入效率
like % 在前面用不到索引
根據聯合索引的第二個及以後的字段單獨查詢用不到索引
.不要使用 select *;會查詢全表的資料影響查詢效率
排序請盡量使用公升序
or 的查詢盡量用 union 代替(innodb)
復合索引高選擇性的字段排在前面
order by / groupby 字段包括在索引當中減少排序,效率會更高
sql 編寫時還需要特別注意一下幾點:
盡量規避大事務的 sql,大事務的 sql 會影響資料庫的併發效能及主從同步
分頁語句 limit 的問題
刪除表所有記錄請用 truncate,不要用 delete
不讓 mysql 幹多餘的事情,如計算
輸寫 sql 帶欄位,以防止後面表變更帶來的問題,效能也是比較優的 ( 涉及到資料字典解析,請自行查詢資料)
在 innodb上用 select count(*),因為 innodb 會儲存統計資訊
慎用 oder by rand()
delete和truncate的區別:
delete是dml,執行delete操作時,每次從表中刪除一行,並且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,可以通過rollback撤消操作
truncate會刪除表中所有記錄,並且將重新設定高水線和所有的索引,預設情況下將空間釋放到minextents個extent,除非使用reuse storage,。不會記錄日誌,所以執行速度很快,但不能通過rollback撤消操作(如果一不小心把乙個表truncate掉,也是可以恢復的,只是不能通過rollback來恢復)
drop> truncate > delete
水平分割:
大資料量的表,我們在提供檢索的時候,應該根據業務的需求,找到表的標準,並在檢索頁面約束使用者的檢索方式,而且要配合分頁
垂直分割:
把某個表的某些字段,這些字段,在查詢時候並不關係,但是資料量很大,我們建議將這些字段放到乙個表中,從而提高效率
1. 優化索引、sql 語句、分析慢查詢
2. 設計表的時候嚴格根據資料庫的設計正規化來設計資料庫
3. 使用快取,把經常訪問到的資料而且不需要經常變化的資料放在快取中,能節約磁碟io
4. 優化硬體;採用ssd,使用磁碟佇列技術(raid0,raid1,rdid5)等;
5. 採用mysql 內部自帶的表分割槽技術,把資料分層不同的檔案,能夠提高磁碟的讀取效率
6. 垂直分表;把一些不經常讀的資料放在一張表裡,節約磁碟i/o
7. 主從分離讀寫;採用主從複製把資料庫的讀操作和寫入操作分離開來
8. 分庫分表分機器(資料量特別大),主要的的原理就是資料路由
9. 選擇合適的表引擎,引數上的優化
10. 進行架構級別的快取,靜態化和分布式
11. 不採用全文索引
1、儲存引擎選擇:如果資料表需要事務處理,應該考慮使用innodb,因為它完全符合acid特性。如果不需要事務處理,使用預設儲存引擎myisam是比較明智的
2、分表分庫,主從。
3、對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引
4、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄
5、應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄
6、應盡量避免在 where 子句中使用 or 來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄
7、update 語句,如果只更改1、2個字段,不要update全部字段,否則頻繁呼叫會引起明顯的效能消耗,同時帶來大量日誌
8、對於多張大資料量(這裡幾百條就算大了)的表join,要先分頁再join,否則邏輯讀會很高,效能很差。
參考原址來自於此
mysql資料庫的優化
先學習一下mysql的相關優化問題,主要是從提高mysql資料庫伺服器的效能的思路進行考慮,主要包含以下8個方面的優化 1 選取最適用的字段屬性 2 使用連線 join 來代替子查詢 sub queries 3 使用聯合 union 來代替手動建立的臨時表 4 事務 5 鎖定表 6 使用外來鍵 7 ...
Mysql 資料庫的優化
1 儲存引擎選擇 如果資料表需要事務處理,應該考慮使用 innodb,因為它完全符合 acid 特性。如果不需要事務處理,使用預設儲存引擎 myisam 是比較明智的 2 分表分庫,主從。3 對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索 引4 ...
MySQL資料庫的優化
索引能大大提高查詢速度,同時卻會降低更新表的速度,如對表進行insert update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案。建立索引會占用磁碟空間的索引檔案。索引適用於不經常修改的字段,並且表越大建立索引的效果越明顯。1mobile為索引字段,name為非索引...