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開發...