mysql常用的一些優化

2021-09-02 09:05:39 字數 2551 閱讀 3066

**深入淺出mysql資料庫開發,優化,管理維護

定期分析表analyze

如果已經刪除了表的一大部分,或者如果您已經對含有可變長度行的表(含有 varchar, blob 或 text 列的表)進行了很多更改,則應使用 optimize table。被刪除的記錄被保持在鏈結清單中,後續的 insert 操作會重新使用舊的記錄位置。您可以使用 optimize table 來重新利用未使用的空間,並整理資料文的碎片。optimize table 只對 myisam, bdb 和 innodb 表起作用。

大批量插入資料:

1.  對於 myisam 型別的表,可以通過以下方式快速的匯入大量的資料。

alter table tblname disable keys;

loading the data

alter table tblname enable keys;

這兩個命令用來開啟或者關閉 myisam 表非唯一索引的更新。在匯入大量的資料到一

個非空的 myisam 表時,通過設定這兩個命令,可以提高匯入的效率。對於匯入大量

資料到乙個空的 myisam 表,預設就是先導入資料然後才建立索引的,所以不用進行

設定。2.  而對於 innodb 型別的表,這種方式並不能提高匯入資料的效率。對於 innodb 型別的表,我們有以下幾種方式可以提高匯入的效率:

a.  因為 innodb 型別的表是按照主鍵的順序儲存的,所以將匯入的資料按照主鍵的順序排列,可以有效的提高匯入資料的效率。如果 innodb 表沒有主鍵,那麼系統會預設建立乙個內部列作為主鍵,所以如果可以給表建立乙個主鍵,將可以利用這個優勢提高匯入資料的效率。

b.  在匯入資料前執行 set unique_checks=0,關閉唯一性校驗,在匯入結束後執行

set unique_checks=1,恢復唯一性校驗,可以提高匯入的效率。

c.  如果應用使用自動提交的方式,建議在匯入前執行 set autocommit=0,關閉自動提交,匯入結束後再執行 set autocommit=1,開啟自動提交,也可以提高匯入的效率。

優化insert語句:

3.  如果你同時從同一客戶插入很多行,使用多個值表的 insert 語句。這比使用分開

insert 語句快(在一些情況中幾倍)。

insert into test values(1,2),(1,3),(1,4)…

4.  如果你從不同客戶插入很多行,能通過使用 insert delayed 語句得到更高的速度。delayed 的含義是讓 insert 語句馬上執行,其實資料都被放在記憶體的佇列中,並沒有真正寫入磁碟;這比每條語句分別插入要快的多;low_priority 剛好相反,在所有其他使用者對錶的讀寫完後才進行插入;

5.  將索引檔案和資料檔案分在不同的磁碟上存放(利用建表中的選項);

6.  如果進行批量插入,可以增加 bulk_insert_buffer_size 變數值的方法來提高速度,但是,這只能myisam 表使用;

7.  當從乙個文字檔案裝載乙個表時,使用 load data infile。這通常比使用很多 insert 語句快 20 倍;

8.  根據應用情況使用 replace 語句代替 insert;

9.  根據應用情況使用 ignore 關鍵字忽略重覆記錄。

優化group by語句:

預設情況下,mysql 排序所有 group by col1,col2,....。查詢的方法如同在查詢中指定 order by子句,mysql 可以毫不減速地對它進行優化,儘管仍然進行排序。如果查詢包括 group by 但你想要避免排序結果的消耗,你可以指定 order by null禁止排序。

例如:insert into foo select a, count(*) from bar group by a order by null;

優化order by:

在某些情況中,mysql 可以使用乙個索引來滿足 order by 子句,而不需要額外的排序 。where 條件和 order by 使用相同的索引,並且 order by 的順序和索引順序相同 ,並且 order by 的字段都是公升序或者都是降序。

例如:下列 sql 可以使用索引。

select * from t1 order by key_part1,key_part2,... ;

select * from t1 where key_part1=1 order by key_part1 desc, key_part2 desc;

select * from t1 order by key_part1 desc, key_part2 desc;

但是以下情況不使用索引:

select * from t1 order by key_part1 desc, key_part2 asc;

--order by 的字段混合 asc 和 desc

select * from t1 where key2=constant order by key1;

--用於查詢行的關鍵字與 order by 中所使用的不相同

select * from t1 order by key1, key2;

--對不同的關鍵字使用 order by:

mysql的一些優化

前言 sql優化,是一種概率層面的優化。至於是否實際使用了我們的優化,需要通過explain進行推測。注意 服務層中有sql優化器,可能會影響我們的優化,同時註明 sql的優化前提是有索引 有索引 有索引 in和exists的使用場景 select from a where exists selec...

mysql一些命令 mysql常用的一些命令

一 授權登入 參考grant all privileges on cacti.to hnf localhost identified by hnf 2014 只給cacti這個資料庫授權 grant all on to root localhost identified by huningfei 只...

一些 Mysql 的優化經驗

一些 mysql 的 優化經驗 從資料庫結構做起 字段型別的定義時遵循以下規則 選用字段長度最小 優先使用定長型 盡可能的定義 not null 數值型字段中避免使用 zerofill 如果要儲存的資料為字串,且可能值已知且有限,優先使用 enum 或 set 索引的優化至關重要 以下如果沒有特殊說...