資料庫sql查詢優化

2021-08-13 01:54:36 字數 2660 閱讀 1926

1.對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。

2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num is

null

最好不要給資料庫留null,盡可能的使用 not null填充資料庫,或者設定預設值為0

3.應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄

4.應盡量

避免在where子句中對字段進行函式或者表示式操作

,這將導致引擎放棄使用索引而進行全表掃瞄。

5.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定

6.分頁查詢語句使用limit分頁查詢資料所耗的時間,與查詢記錄條數的起始位置有關,如

select id,name from log_tag  limit 1000,10

從第1000條資料開始查,查10條資料。此時建立(id,name)的覆蓋索引,速度會快很多

altertable log_tagadd index id_name (id, name)

1.最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

3.索引列不能參與計算,保持列「乾淨」,比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);

4.盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

關於explain命令相信大家並不陌生,具體用法和字段含義可以參考官網explain-output,這裡需要強調rows是核心指標,所以優化語句基本上都是在優化rows。

0.先執行看看是否真的很慢,注意設定sql_no_cache

1.where條件單錶查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單錶每個字段分別查詢,看哪個欄位的區分度最高

2.explain檢視執行計畫,是否與1預期一致(從鎖定記錄較少的表開始查詢)

3.order by limit 形式的sql語句讓排序的表優先查

4.了解業務方使用場景

5.加索引時參照建索引的幾大原則

6.觀察結果,不符合預期繼續從0分析

看乙個具體例子:

explain的時候,type值all, index,  range, ref, eq_ref, const, system, null(從左到右,效能從差到好),至少要做到rang以上才算ok。

rows越少說明掃瞄的項越少

查詢需要3.12s,掃瞄了60多萬次。

這是最後優化後的語句:

用時變成了0.04s,其中在log_money上面建了乙個覆蓋索引(operatetype,optime).注意順序與where後面的一致,

並且=的放前面

mysql資料庫sql優化 子查詢優化

1 什麼是子查詢 表關聯查詢 子查詢 是指在主sql語句中的select或where子句中使用select查詢語句 select a.name,select b.name from b where b.id a.id from a where a.name lik a 表關聯查詢 指多個表聯合查詢 ...

sql優化,資料庫優化

1.sql的執行順序 from 表名 where 條件 執行順序是從後往前,where條件後面的語句盡可能縮短where 資料執行的範圍。先group by 後order by select 查詢 2.避免過多的聯查,設計合理的表關係 3.遵守常見sql規範,盡可能減少 4.如果表字段過多,經常展示...

sql優化 資料庫優化

資料庫優化 資料庫優化吧我覺應該從硬碟 記憶體和網路頻寬考慮,提高硬碟的讀寫速度,增大頻寬提高吞吐量,增大伺服器記憶體,可以採用讀寫分離,降低單台資料庫的訪問壓力,查詢的時候控制資料量的大小,返回更少資料,減少互動次數,減少cpu及記憶體的開銷,sql優化 如果乙個表中資料量過大我們可以採用橫切割,...