MySQL效能優化

2021-07-28 11:03:21 字數 2587 閱讀 6354

設計上的優化:

欄位的設計,引擎的選擇,索引的選擇.

1、選取最適用的字段屬性

另外乙個提高效率的方法是在可能的情況下,應該盡量把字段設定為not null,這樣在將來執行查詢的時候,資料庫不用去比較null值。

對於某些文字字段,例如「省份」或者「性別」,我們可以將它們定義為enum型別。因為在mysql中,enum型別被當作數值型資料來處理,而數值型資料被處理起來的速度要比文字型別快得多。這樣,我們又可以提高資料庫的效能

2.引擎的選擇:

3.建立索引,加快查詢效能.

a.在建立復合索引的時候,在where條件中用到的字段在復合索引中,則最好把這個字段放在復合索引的最左端,這樣才能使用索引,才能提高查詢。

b.保證連線的索引是相同的型別,意思就是a表和b表相關聯的字段,必須是同型別的。這些型別都建立了索引,這樣才能兩個表都能使用索引,如果型別不一樣,至少有乙個表使用不了索引。

c.索引,不僅僅是主鍵和唯一鍵,也可以是其他的任何列。在使用like其中乙個有索引的字段列的時候。

select *from a name like 『***%』;

這個sql會使用name的索引(前提name建立了索引);而下面的語句就使用不了索引

select * from a name like 『%***』;

因為『%』代表任何字元,%***不知道怎麼去索引的,所以使用不了索引。

d.復合索引

比如有一條語句這樣的:

select* from users where area =』beijing』 and age=22

;

如果我們是在area和age上分別建立索引的話,由於mysql查詢每次只能使用乙個索引,所以雖然這樣已經相對不做索引時全表掃瞄提高了很多效率,但是如果area,age兩列上建立復合索引的話將帶來更高的效率。如果我們建立了(area,age,salary)的復合索引,那麼其實相當於建立了(area,age,salary),(area,age),(area)三個索引,這樣稱為最佳左字首特性。因此我們在建立復合索引的應該將最常用作限制條件的列放在最左邊,依次遞減。

e.索引不會包含有null值的列

只要列中包含有null值都將不會被包含在索引中(除非是唯一值的域,可以存在乙個null),復合索引中只要有一列含有null值,那麼這一列對於此復合索引是無效的。所以我們在資料庫設計時不要讓字段的預設值為null.

f.使用短索引

對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的列,如果在錢10個或者20字元內,多數值是唯一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。

g.排序的索引問題

mysql查詢只是用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。

sql語句的優化:

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

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

select id from t where num is null  

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

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

select id from t where num/2=100

應改為:   

select id from t where num=100*2

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

5.在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。很多時候用 exists 代替 in 是乙個好的選擇:   

select num from a where num in(select num from b)

用下面的語句替換:   

select num from a where 

exists

(select

1 from b where num=a.num)

6. 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

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生成乙個執行計...