「MYSQL」查尋效能優化

2021-09-01 01:21:29 字數 4482 閱讀 1656

「mysql」查尋效能優化

注: 1  mysql官網的優化方法:

第一:索引問題

下面列出了目前 mysql 中與索引使用相關的限制。

(1)myisam儲存引擎索引鍵長度的總和不能超過1000位元組;

(2)blob和text型別的列只能建立字首索引;

(3)mysql 目前不支援函式索引;

(4)使用不等於(!= 或者 <>)的時候,mysql 無法使用索引;

(5)過濾字段使用了函式運算(如abs(column))後,mysql無法使用索引;

(6)join 語句中 join 條件字段型別不一致的時候,mysql 無法使用索引;

(7)使用like操作的時候如果條件以萬用字元開始(如』%abc…』)時,mysql無法使用索引;

(8)使用非等值查詢的時候,mysql 無法使用 hash 索引。

注:摘至

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

2 經常同時訪問多列,且每列都含有重複值可考慮建立組合索引

3 組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助於提高效能但不是索引越多越好,恰好相反過多的索引會導致系統低效。使用者在表中每加進乙個索引,維護索引集合就要做相應的更新工作。

4 索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要.

5 並不是所有索引對查詢都有效,sql是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,sql查詢可能不會去利用索引,如一表中有 字段***,male、female幾乎各一半,那麼即使在***上建了索引也對查詢效率起不了作用.

6 在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會 被使用,並且應盡可能的讓字段順序與索引順序相一致.

第二: where(in)問題

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

select id from t where num is null

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

3 .應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

4.in 和 not in 也要慎用,否則會導致全表掃瞄(有空值等),如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

5. 如果在 where 子句中使用引數,也會導致全表掃瞄。因為sql只有在執行時才會解析區域性變數,但優化程式不能將訪問計畫的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計畫,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃瞄:

select id from t where num=@num

可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

6.應盡量避免在 where 子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where num/2=100

應改為:

select id from t where num=100*2

7.應盡量避免在where子句中對字段進行函式操作,這將導致引擎放棄使用索引而進行全表掃瞄。如:

select id from t where substring(name,1,3)=』abc』–name以abc開頭的id

select id from t where datediff(day,createdate,』2005-11-30′)=0–『2005-11-30』生成的id

應改為:

select id from t where name like 『abc%』

select id from t where createdate>=』2005-11-30′ and createdate<』2005-12-1′

8 .不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引

9 關於union(有時取代where in)

union:

in、or子句常會使用工作表,使索引失效。如果不產生大量重複值,可以考慮把子句拆開。拆開的子句中應該包含索引.

例如 select * from city where id in (2,5);

select * from city where id = 2 union select * from city where id = 5

如果加上關鍵字all(即union all)

select * from city where id = 2 union all select * from city where id = 5

兩者差異 :

union 在進行表鏈結後會篩選掉重複的記錄,所以在表鏈結後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄, 最常見的是過程表與歷史表union。union all 只是簡單的將兩個結果合併後就返回。這樣,如果返回的兩個結果集中有重複的資料,那麼返回的結果集就會包含重複的資料了。從效率上說,union all 要比union快很多。

union與order by

(1 )如果要使用order by 或者limit子句來對全部 union結果進行分類或限定。則應對單個地select語句加圓括號,並把order by

或limit放到最後乙個的後面。

(select * from city where id = 2) union all (select * from city where id = 5) order by id limit 10;

(2 )如果要使用order by 或者limit子句來對單個 union結果進行分類或限定,則應把order by或limit放到圓括號中。

(select * from city where id = 2 order by id limit 10) union all (select * from city where id = 5 order by id limit 10) ;

另註:(1) 在union中order by 不能使用包括表名稱(即table_name.col_name)列引用格式.

(2) 如果帶分類的一列有別名,則orderby 子句必須引用別名,而不能引用列名稱。

第三:其他

1 只要能滿足你的需求,應盡可能使用更小的資料型別:例如使用mediumint代替i

2 任何地方都不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何欄位.

3 在計算行總數時,select count(*) from t 較好。

4 在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert

注:以上資訊來致web~以及自己的總結。

query 語句的優化思路和原則:

1. 優化更需要優化的 query ;

2. 定位優化物件的效能瓶頸;

3. 明確的優化目標;

4. 從 explain 入手;

5. 多使用 profile

6. 永遠用小結果集驅動大的結果集;

7. 盡可能在索引中完成排序;

8. 只取出自己需要的 columns ;

9. 僅僅使用最有效的過濾條件;

10. 盡可能避免複雜的 join 和子查詢;

(摘至:《

mysql效能調優與架構設計

》 )優化不是這上面幾句話就搞定了的,應視具體情況而定(

盡信書不如無書

:-)

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...

mysql的效能優化 mysql效能優化

檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...

mysql 效能優化 命令 mysql效能優化

發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...