常用的Mysql優化方式
- 服務器硬件,如機械硬盤改成固態硬盤等
- MySql服務器優化,windows系統上跑着跑着就會多垃圾等,裝到Linux上比較穩定
- SQL本身優化,關聯子查詢改爲--關聯查詢(思考,因爲關聯查詢效率高)
- 反範式設計優化
- 索引優化(重點,下篇文章介紹)
關聯子查詢改爲關聯查詢
- 子查詢裏面又關聯==關聯子查詢
- 如果是普通的子查詢,或者數據量不是很大,則不需要優化
原因:執行子查詢時,MYSQL需要創建臨時表,查詢完畢後再刪除這些臨時表,所以,子查詢的速度會受到一定的影響,這裏多了一個創建和銷燬臨時表的過程。可以使用連接查詢(JOIN)代替子查詢,連接查詢不需要建立臨時表,因此其速度比子查詢快。
以下是關聯子查詢
SELECT
a.date_str,
(
SELECT
b.shop_type
FROM
dp_shop b
WHERE
a.shopCode = b.shop_code
) shop_type
FROM
dp_car_copy2 a
查詢用時接近4s
改成關聯查詢後
SELECT
a.date_str,
b.shop_type
FROM
dp_car_copy2 a,dp_shop b
WHERE
a.shopCode = b.shop_code
查詢用時僅需0.7秒
反範式設計優化
如果是電商項目,着重於查詢效率,此時適當反範式會更好
反範式化是針對範式化而言的,所謂得反範式化就是爲了性能和讀取效率得考慮而適當得對數據庫設計範式得要求進行違反
允許存在少量得冗餘,換句話來說反範式化就是使用空間來換取時間
三大範式:
1、數據庫中所有字段都具有單一屬性原子性
2、要求表中只具有一個業務主鍵,也就是符合第二範式的表不能存在非主鍵列只對部分主鍵的依賴關係
3、指每一個非主鍵屬性既不能部分依賴於也不傳遞依賴於業務主鍵,也就是第二範式的繼承上加了非主鍵對主鍵的傳遞依賴(不是主鍵的屬性有着說不清的依賴,就是違反))
原來是一張表,因爲不滿足第一範式,不符合原子性,導致拆分成兩張表
原來是兩張表,因爲不滿足第二範式,存在非主鍵列只對部分主鍵的依賴關係,使得兩張表又得拆分成三張
原來是三張。。。因爲減少冗餘,使得越來越多的表,進行查詢時,關聯、inner等使得查詢效率低
此時,反範式設計優化產生
表
增加冗餘後
查詢有關shop_type時,效率增高