MySQL效能優化

2022-03-27 18:24:52 字數 2408 閱讀 7338

當今資料庫的操作越來越成為整個應用的效能瓶頸,特別是web應用更加明顯。當我們設計資料庫和對資料庫操作時,都要考慮到效能。

大多數mysql伺服器都開啟了查詢快取,這是提高效能最有效的方案之一,而且這是被mysql的資料庫引擎處理的。當有很多相同的查詢被執行多長的時候,這些下次結果會被放到乙個快取中,這樣後續相同的查詢就不需要操作表,而是直接從快取中訪問結果。

這裡最主要的原因是對於程式設計師來說,這個事情很容易被忽略。因為我們的某些查詢語句不會讓mysql生成快取。如下示例:

//查詢快取不開啟

select username from user where reg_time = curdate();

//查詢快取開啟

$today = date('y-m-d');

select username from user where reg_time = '$today';

上面兩條sql的區別在於curdate(),mysql的查詢快取對這個函式不起作用,像now()、rand()等等諸如此類的sql函式都不會開啟快取,因為這些函式的返回是會變的。所以你要用乙個變數來代替mysql的函式,從而開啟快取。

使用explain關鍵字可以讓你知道mysql是如何處理你的sql語句的。這可以幫你分析你的查詢語句或是表結構的效能瓶頸。

explain的查詢結果還會告訴你你的索引主鍵被如何利用的,你的資料表是如何被搜尋和排序的……等等,等等。

挑乙個你的select語句(推薦挑選那個最複雜的,有多表聯接的),把關鍵字explain加到前面。

下面這個例子,我們沒有給com_id新增索引:

當我們給com_id欄位新增索引後

我們可以很明顯的看到,前乙個搜尋結果檢索了3592行,而後乙個只檢索了1行。

索引並不一定就是給主鍵或是唯一的字段。如果在你的表中,有某個欄位你總要會經常用來做搜尋,那麼為其建立索引。

如果你的應用程式有很多join查詢,你應該確認兩個表中join的字段是被建過索引的。這樣,mysql內部會啟動為你優化join的sql語句的機制。

而且,這些被用來join的字段,應該是相同的型別的。例如:如果你要把decimal欄位和乙個int欄位join在一起,mysql就無法使用它們的索引。對於那些string型別,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣)

從資料庫裡讀的資料越多,查詢執行就越慢。並且,如果你的mysql伺服器和web伺服器是兩個獨立的伺服器,那麼還會增加網路傳輸的負載。

我們應該為資料庫裡的每張表都設定乙個id做為其主鍵,而且最好的是乙個int型的(推薦使用unsigned),並設定上自動增加的auto_increment標誌。就算是你users表有乙個主鍵叫「email」的字段,你也別讓它成為主鍵。使用varchar型別來當主鍵會使用得效能下降。另外,在你的程式中,你應該使用表的id來構造你的資料結構。而且,在mysql資料引擎下,還有一些操作需要使用主鍵,在這些情況下,主鍵的效能和設定變得非常重要,比如,集群,分割槽……

在這裡,只有乙個情況是例外,那就是「關聯表」的「外來鍵」,也就是說,這個表的主鍵,通過若干個別的表的主鍵構成。我們把這個情況叫做「外來鍵」。比如:有乙個「學生表」有學生的id,有乙個「課程表」有課程id,那麼,「成績表」就是「關聯表」了,其關聯了學生表和課程表,在成績表中,學生id和課程id叫「外來鍵」其共同組成主鍵。

mysql也有乙個「建議」(見第9條)告訴你怎麼去重新組織你的表結構。當你有乙個varchar欄位時,這個建議會告訴你把其改成enum型別。使用procedure analyse() 你可以得到相關的建議。

procedure analyse() 會讓mysql幫你去分析你的字段和其實際的資料,並會給你一些有用的建議。只有表中有實際的資料,這些建議才會變得有用,因為要做一些大的決定是需要有資料作為基礎的。

例如,如果你建立了乙個int欄位作為你的主鍵,然而並沒有太多的資料,那麼,procedure analyse()會建議你把這個欄位的型別改成mediumint。或是你使用了乙個varchar欄位,因為資料不多,你可能會得到乙個讓你把它改成enum的建議。這些建議,都是可能因為資料不夠多,所以決策做得就不夠準。

除非你有乙個很特別的原因去使用null值,你應該總是讓你的字段保持not null。首先,問問你自己「empty」和「null」有多大的區別(如果是int,那就是0和null)?如果你覺得它們之間沒有什麼區別,那麼你就不要使用null。(你知道嗎?在oracle裡,null 和 empty的字串是一樣的!)

不要以為 null 不需要空間,其需要額外的空間,並且,在你進行比較的時候,你的程式會更複雜。當然,這裡並不是說你就不能使用null了,現實情況是很複雜的,依然會有些情況下,你需要使用null值。

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