MySQL效能優化

2021-09-11 10:53:53 字數 4678 閱讀 2337

2、優化查詢

3、優化資料庫結構

3.4分析表、檢查表和優化表

效能優化是指通過某些有效的方法提高mysql資料庫的效能,效能優化的目的是為了使mysql資料庫執行速度更快,占用的磁碟空間更小,效能優化方面包括很多方面,例如優化查詢速度,優化更新速度和優化mysql伺服器等。本博文將介紹效能優化的目的,優化查詢,優化資料庫結構和優化mysql伺服器的方法,以提高mysql資料庫的速度。

資料庫管理員可以用show status語句查詢mysql資料庫的效能,語法形式:show status like 'value';

其中value引數時常用的幾個統計引數如下:

在mysql的命令列視窗中輸入查詢語句後,在查詢結果下方會自動顯示查詢所用時間,但是這個時間是以秒為單位,如果資料量少,機器配置又不低時,很難看出速度上的差異。這時可以通過mysql提供的profile工具實現語句消耗效能的分析。

查詢是對資料庫最頻繁的操作,提高了查詢速度可以有效的提高mysql資料庫的效能。

在mysql中,可以使用explain語句和describe語句來分析查詢語句,應用explain關鍵字分析查詢語句,其語法結構如下:explain select 語句;

「select 語句」引數為一般資料庫查詢命令,如「select * from students」.

在查詢過程中使用索引,勢必會提高資料庫查詢效率,應用索引來查詢資料庫中的內容,可以減少查詢的記錄數,從而達到優化查詢的目的。

舉例分析索引對查詢速度的影響。

首先分析未使用索引時的查詢情況,其**如下:explain select * from tb_bookinfo where bookname='程式設計';

當資料庫中存在的少數幾條資料的時候,查詢不會有太大影響,當資料庫中儲存了龐大的資料資料時,使用者為了搜尋一條資料而遍歷整個資料庫中的所有記錄,這將會耗費很多時間。

現在,在book_name欄位上建立乙個名為index_name的索引,建立索引的**如下:

create index index_name on tb_bookinfo(bookname);

在建立玩索引完畢後,然後再用explain關鍵字分析執**況,其**如下:

explain select * from tb_bookinfo where bookname='程式設計';

從執行結果看,建立了索引使訪問的行數由之前5行減少到1行。所以,在查詢操作中,使用索引不但會自動優化查詢效率,同時也會降低伺服器的開銷。

在mysql中,索引可以提高查詢的速度,蛋並不能充分發揮其作用,所以在應用索引查詢時,也可以通過關鍵字或其他方式來對查詢進行優化處理。

首先,應用like關鍵字,並且匹配字串中含有百分號「%」符號,應用explain語句執行如下命令```explain select * from tb_bookinfo where bookname like '%設計';```

在匹配字串中,第乙個字元為百分號「%」時,索引不會被使用,如果「%」所在匹配字串中的位置不是第一位置,則索引不會被正常使用

多列索引是指在表的多個欄位上建立乙個索引。只有查詢條件中使用了這些欄位中的第乙個欄位時,索引才會被正常使用。

eg:應用多列索引在表tb_bookinfo 的多個字段(bookname和price欄位)中建立乙個索引,其命令如下:create index index_name on tb_bookinfo(bookname,price);

在應用price欄位時,索引不能被正常使用。這就意味著索引並未在mysql優化中起到任何作用,故必須使用第一欄位bookname時,索引才可以被正常使用。

在mysql中,查詢語句只有包含or關鍵字時,要求查詢的兩個字段必須同時為索引,如果所搜尋的條件中,有乙個欄位不為索引,則在查詢中不會應用索引進行查詢。其中,應用or關鍵字查詢索引的命令如下:select * from tb_bookinfo where bookname='程式設計' or price = 89;

通過explain來分析使用or關鍵字的查詢命令

在bookname欄位上建立乙個名為index_price的索引,建立索引的**:

create index index_price on tb_bookinfo(price);

使用explain來分析使用or關鍵字的查詢,命令如下:

explain select * from tb_ where bookname = '程式設計' or price=89;

資料庫結構是否合理,需要考慮是否存在冗餘,對錶的查詢和更新的速度、表中字段的資料型別是否合理等多方面的內容。

有些表在設計時設定了很多字段,而這個表中有些欄位的使用頻率很低,當這個表的資料量很大時,查詢資料的速度就會很慢。對於這種字段特別多,且有些欄位的使用頻率很低的表,可以將其分解成多個表。

eg:在學生表tb_student中有很多字段,其中extra欄位中儲存這學生的備註資訊。有些備註資訊的內容特別多,但是備註資訊很少使用。這樣就可以分解出另外乙個表(同時將tb_student中的extra欄位刪除),將這個分解出來表取名為tb_student_extra。表中儲存著兩個字段,分別為id和extra。其中id欄位為學生的學號,extra欄位儲存備註資訊。

如果需要查詢某個學生的備註資訊,可以用學號(id)來查詢。如果需要將學生的學籍資訊與備註資訊同時顯示時,可以將tb_student表和tb_student_extra表進行聯表查詢,查詢語句如下:select * from tb_student,tb_student_extra where tb_student.id = tb_student_extra.is;

通過這種分解,可以提高tb_student表的查詢效率。因此遇到這種字段很多,而且有些字段使用不頻繁的表時,可以通過這種分解的方式來優化資料庫的效能。

有時需要經常查詢兩個表中的幾個字段。如果經常進行聯表查詢,會降低mysql資料庫的查詢速度。對於這種情況,可以建立中間表來提高查詢速度。

先分析經常需要同時查詢哪幾個表中的哪些字段,然後將這些字段建立乙個中間表,並將原來的那個表的資料插入到中間表正宗,之後就可以使用中間表來進行查詢和統計。

eg:建立包含學生常用資訊的中間表。

有兩張資料表,既學生表tb_student和tb_classes。實際應用中,經常要查詢學生的學號、姓名和班級。根據這種情況,可以建立乙個temp_student表。temp_student表中儲存3個字段,分別是id、name和classname。create 語句執行如下:

create table temp_student(

id int not null,

name varchar(45) not null,

classname varchar(45);)

然後從tb_student和tb_classes表中將記錄儀匯入到temp_student表中,insert 語句如下:

insert into temp_student select s.id,s.name,c.classname from tb_student s ,tb_classes c where s.id = c.id.

將這些資料插入到temp_student表中以後,可以直接從temp_student表中查詢學生的學號、姓名、班級名稱。這樣就省去每次查詢時進行表連線,可以提高資料庫的查詢速度。

插入記錄時,索引、唯一性的校驗都會影響到插入記錄的速度。而且一次插入多條記錄和多次插入記錄所耗費的時間是不一樣的。根據這些情況分別進行不同的優化。

插入記錄時,mysql會根據表的索引對插入的記錄進行排序。如果插入大量資料時,這些排序會降低插入記錄的速度,為了解決這種情況,可以在插入記錄之前先禁用索引,等到記錄都插入完成後再開啟索引,禁用索引的語句如下:

alter table 表名 disable keys;

重新開啟索引的語句如下:

alter table 表名 enable keys;

對於新建立的表,可以先不建立索引,等到記錄都匯入以後在建立索引。這樣可以提高匯入資料的速度。

插入資料時,mysql會對插入的記錄進行校驗。這種校驗也會降低插入記錄的速度。可以在插入記錄之前禁用唯一性檢查,等到記錄插入完畢後在開啟。禁用唯一性檢查的語句如下:

set unique_checks = 0;

重新開啟唯一性檢查的語句如下:

set unique_checks = 1;

插入多條記錄時,可以採取兩種寫insert語句的方式。第一種是乙個insert語句插入多條記錄。insert語句的情形如下:

insert into tb_foods values(null,』果凍』,』1.8』),(null,』橙子』,』2.2』);

第二種是每乙個insert 語句插入一條記錄。很明顯第一種方式減少了與資料庫之間的連線操作,其速度比第二種方式要快。

當插入大量資料時,建議使用乙個insert語句插入多條記錄的方式。而且如果能用load data infile語句就盡量用load data infile語句。因為load data infile語句匯入資料的速度比insert語句的速度快。

分析表的主要作用是分析關鍵的分布。檢查表的主要作用是檢查表是否存在錯誤。優化表的主要作用是消除刪除或者更新造成的空間浪費。

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