SQL效能優化

2021-10-24 07:47:16 字數 3452 閱讀 2254

mysqls資料庫的優化是多個方面的,原則是減少系統的瓶頸,減少資源的占用。增加系統的反應速度。例如,通過優化檔案系統提高磁碟i/o的讀寫速度;通過優化作業系統排程策略提高mysql在高負荷情況下的負載能力;優化表結構、索引、查詢語句使查詢響應更快。

> show status like 'value'
其中value是要查詢的引數值,一些常用的效能引數如下:

> explain  [extended]  select select_options
使用extended關鍵字,explain語句將產生附加資訊。select_options是select語句的查詢選項,包括from where子句等。

例如:

> explain select * from fruits
建立索引:
mysql>create index index_name on fruits(f_name)
或者:

mysql>alter table fruits add index index_name(f_name)

;

索引失效的幾種情況:

1:使用like關鍵字的查詢語句

在使用like關鍵字進行查詢的查詢語句中,如果匹配字串的第乙個字元為「%」,索引不會起作用。只有「%」不在第乙個位置,索引才會起作用。

mysql> explain select * from fruits where f_name like 'x%'
2:使用多列索引的查詢語句

mysql可以為多個字段建立索引。乙個索引可以包括16個字段。對於多列索引,只有查詢條件中使用了這些欄位中第乙個欄位時,縮影才會被使用。

3:使用or關鍵字的查詢語句

查詢語句的查詢條件中只有or關鍵字,且or前後的兩個條件中都是索引時,查詢中才使用索引。否則,查詢將不適用索引。

mysql> explain select * from fruits where f_name=
:當進行資料insert的時候,mysql客戶端大致要經過的步驟如下:

優化方法:

(1) 根據以上步驟可以看出,如果從同一客戶端插入很多行資料到mysql伺服器,如果一次性插入多個值,將大大縮短客戶端與資料庫伺服器之間連線和關閉等操作,例如:

insert into books values(1,'books1'

),(2,'books2'

),(3,'books3'

);

(2)對於myisam型別的表,如果從不同客戶插入很多行,可以通過使用insert delayed 語句提公升執行速度。insert delayed into 是客戶端提交資料給mysql伺服器,mysql伺服器返回ok狀態給客戶端,而這並不是將資料立即插入到表,而是儲存在記憶體裡面等待排隊,直到當mysql伺服器有空閒時再插入。此時資料並沒有真正寫入到磁碟,這樣的好處是提高插入資料的速度,不好的地方在於,如果系統崩潰,mysql還沒寫入磁碟的資料將丟失。

(3)禁用唯一性檢查

插入之前執行下面命令來禁止對唯一性索引的檢查

set unique_checks=0
資料匯入完成之後,執行下面的命令再開啟對唯一性索引的檢查

set unique_checks=1
(4)innodb中可以禁用外來鍵檢查

資料匯入之前關閉

set foreign_key_checks=0
資料匯入之後開啟外來鍵檢查

set foreign_key_checks=1
(1)對order by +limit 組合的索引優化,sql形式如下:

select [column1]

... from [table] order by [sort] limit [offset],[limit]

;

該sql語句優化只需要在[sort]上建立索引即可。

(2)對where +order by +limit 組合的索引優化,sql形式如下:

select [column1]

... from [table] where [columnx]

=[value] order by [sort] limit [offset],[limit]

;

此時如果只對[sort]新增索引,效率不是很高,還可以採用更加高效的方法建立乙個聯合索引(columnx,sort);

(3)不要對where 和order by 的選項使用表示式或者函式,sql形式如下:

select * from [table] order by year(date) limit 0,30;
下面幾種情況不應該使用索引:

(1)order by的字段混合使用desc和asc

mysql>select * from ordertable order by col1 desc,col2 asc
(2)where子句使用的字段和order by的字段不一致

mysql>select * from ordertable where col1=1 order col2
(3)對不同的關鍵字使用order by排序

mysql>select * from ordertable order by col1,col2
使用group by語句,nysql會對符合的結果自動排序。通過掃瞄整個表並建立乙個新的臨時表,表中每個組的所有行為應該是連續的,然後使用該臨時表來找到組並應用累計行數。在某些情況下,mysql可以通過所有訪問而不用臨時表。通過指定order by null可以禁止排序,從而節省耗損。

mysql>explain select

id ,count(data) from test group by id order by null;

使用order by null 的group by 語句減少了檔案排序的步驟,當返回結果集很大時,對於group by的效能是有很大改善的。

執行子查詢時,mysql需要為內層查詢語句的查詢結果建立乙個臨時表,然後外層查詢語句從臨時表中查詢記錄。查詢完畢後再撤銷這些臨時表,因此,子查詢的速度會受到一定的影響。如果查詢的資料量比較大,這種影響就會隨之增大。

在mysql中可以使用連線(join)查詢來替代子查詢,連線查詢不需要建立臨時表,其速度比子查詢要快,如果查詢中使用索引的話,效能會更好。

對於使用or條件語句的子查詢,如果要使用索引,則or之間的每個條件列都必須使用到索引。如果沒有索引,可以考慮新增索引。

將字段很多的表分解成多個表

增加中間表

增加冗餘字段

效能優化 SQL優化

1.列型別盡量定義成數值型別,且長度盡可能短,如主鍵和外來鍵,型別字段等等 2.建立單列索引 3.根據需要建立多列聯合索引 當單個列過濾之後還有很多資料,那麼索引的效率將會比較低,即列的區分度較低,那麼如果在多個列上建立索引,那麼多個列的區分度就大多了,將會有顯著的效率提高。4.根據業務場景建立覆蓋...

SQL效能優化

postgre資料表資料比較多的情況下,使用模糊查詢效能很差,但是使用函式反而快了,返回資料一致,有點不解 warning表2688133條資料,warning message表6954788條資料 這個sql執行老半天都沒反映,耗時169904 ms select count 1 from war...

sql效能優化

任何平台的sql開發者都有自身的困惑,似乎他們一直糾纏在do while迴圈裡,這個迴圈讓他們不斷地重複同樣的錯誤。這是因為資料庫的發展依然不夠成熟。當然,商們也在不斷進步,但是他們還是需要處理更嚴重的問題。併發性,資源管理,空間管理和速度依然制約著sql開發者對開發平台的選擇。我並不期望sql開發...