資料庫優化的八種方式

2021-10-08 12:03:22 字數 2937 閱讀 9455

在mysql資料中,表越小,資料庫執行的效率就越高,所以我們在建立表的時候,為了獲取更好的效能,我們就要將字段的寬度設定的盡可能的小。例如,在寫**號碼這個欄位的時候,我們使用char(255),或者vachar型別,都會給資料庫增加不必要的空間,我們可以用char(11)就可以了,不會造成不必要的空間浪費。對於某些文字字段,例如性別,我們可以把它定義為enum型別,因為在mysql中,enum型別會被當作資料型別來處理,而數值型別資料被處理起來速度比文字型別快得多。另乙個提高效率方法就是在可能的情況下,應該盡量把字段設定為not null,這樣在執行查詢的時候,資料庫就不用去比較null值。

mysql在4.1開始就支援sql的子查詢,我們可以查詢某個列的資訊,然後將查詢結果作為過濾條件作用在另乙個查詢中。例如,我們想要將客戶基本資訊表中沒有任何訂單的客戶刪除,可以就可以先查詢出全部客戶資訊的id,然後將結果傳遞給主查詢。

delete from customerinfo 

where customid not in (select customid from salesinfo)

使用子查詢可以完成很多邏輯上需要多個步驟才能完成sql操作,同時也可以避免事務或者表鎖死,並且寫起來容易。但是有些情況下,子查詢可以被更有效率的連線查詢(join)代替。例如我們要將所有沒有訂單的使用者取出來,可以用下面的查詢完成:

select * from customerinfo 

where customid not in (select customid from salesinfo)

但是,如果我們使用連線查詢(join)查詢的時候,速度會快很多,尤其是當salesinfo表中對customid存在索引的情況下,效能會更好,查詢語句如下:

select * from customerinfo 

left join salesinfo on customerinfo.customid = salesinfo.customid

where salesinfo.customid isnull;

連線查詢(join)的效率更快的原因是mysql並不需要在記憶體中建立臨時表來完成這個邏輯上需要兩個步驟的查詢工作。

mysql在4.0開始支援聯合(union)查詢,可以把需要使用臨時表的兩條或者更多的select查詢合併到乙個查詢中。在客戶端完成查詢之後,臨時表會自動刪除,從而保證資料庫的高效和整齊。使用union來建立查詢的時候,我們只需要用union關鍵字把多個select語句連線起來就可以了,注意:所有的select語句中的字段數目要相同。

select name,phone from client union

select name,birthdata from author union

select name,supplier from product;

儘管我們可以使用連線查詢,聯合查詢和子查詢來建立一系列的查詢,但是並不是所有的資料庫操作都可以只用一條或少數幾條sql語句就可以完成,更多的時候是需要用到一系列的語句來完成操作。在這種情況下,如果某條語句出現錯誤的情況下,整個語句塊的操作就會變得不確定,這時候,我們就需要使用事務,事務的四大性質即原子性、隔離性、一致性和永續性能夠保證資料庫的一致性和完整性。

使用事務雖然可以很好的維持資料庫的完整性,但卻因為他獨佔整個資料庫,有時也會嚴重影響資料庫的效能,尤其是在很大的應用系統中。此時,我們可以通過鎖定表的方式來獲取更高的效能。

lock table inventory write select quantity from inventory where item='book';

...update inventory set quantity=11 where item='book'; unlocktables

鎖定表的方法可以維護資料的完整性,但是卻不能保證資料的關聯性,這個時候我們就可以使用外來鍵。

create    table    customerinfo( customeridint    not    null,primarykey(customerid))type=innodb;

create table salesinfo( salesidnt not null,customeridint not null,

primarykey(customerid,salesid),

foreignkey(customerid) references customerinfo(customerid) on delete cascade)type=innodb;

索引是提高資料庫效能的常用方法,它可以另資料庫伺服器以比沒有建立索引快得多的速度檢索特定的行,尤其是當語句中包含max()、min()和order by這些命令的時候,效能提公升的更加明顯。

一般來說,索引應該建立在哪些將用於join、where判斷和order by排序的字段上,盡量不要對資料庫的某個含有大量重複的值的字段建立索引,對於enum型別的字段來說,出現大量重複的值的可能性非常大

絕大多數情況下,使用索引可以提高查詢速度,但如果sql語句使用不恰當,索引將無法發揮應有的作用。下面是應該注意的幾個事項:

首先,最好是在相同型別的字段間進行比較的操作。

其次,再建有索引的字段上盡量不要使用函式進行操作。

第三,再搜尋字元型字段時,我們有時會使用like關鍵字和萬用字元,這種做法雖然簡單,但卻是以犧牲系統效能作為代價的。

例如:

select * from books where name like 」mysql%「
可以用

select * from books where 

name>= "mysql" and name<"mysqm"

來代替,效能會高很多。

最後,應該避免查詢讓mysql進行自動型別轉換,因為轉換過程也會使索引失效。

Mysql資料庫優化的八種方式

把表中字段的寬度設的盡可能小 在可能的情況下盡量把字段設定為notnull,這樣在將來執行查詢的時候,資料庫不用去比較null值 可以設定為數字型的盡量設定為數值型,因為數值型處理起來的速度比文字型別快得多。delete from customerinfo where customerid not ...

Mysql資料庫優化的八種方式

1 選取最適用的字段屬性 mysql可以很好的支援大資料量的訪問,但是一般說來,資料庫中的表越小,在它上面執行的查詢也就會越快。因此,在建立表的時候,為了獲得更好的效能,我們可以將表中字段的寬度設得盡可能小。2 使用連線 join 來代替子查詢 sub queries 3 使用聯合 union 來代...

資料庫優化的方式

避免全表掃瞄 首先考慮在where及order by涉及的列上建立索引 避免在where子句中對字段進行null判斷這樣會導致全表掃瞄 避免出現where子句中對字段進行null值判斷 demo select id from t where num is null可以替換為select id fro...