在之前我寫過一篇關於這個方面的文章
《【原創】為什麼使用資料索引能提高效率?(本文針對mysql進行概述)(更新)》
這次,主要側重點講下兩種常用儲存引擎。
我們一般從兩個方面進行mysql資料庫優化:
a、sql語句的優化。
這點,需要我們在寫sql的時候要特別注意,在建表的時候也非常注意。
1 盡量不要在列上進行運算,這樣會導致索引失效。
2 使用join時候,應使用小結果集驅動大結果集。把複雜的join拆分成多個query。在多join的時候,最容易導致鎖表和堵塞。
3 在使用like進行模糊查詢時候,避免使用%%。這樣即使有索引的情況下,索引也會失效。
如:
select * from tablename where name like '%wang%'
需要進行優化:
select * from tablename where name >= 'wang' and name < 'wanh'
這樣,將會使用到索引。前提是你對列name新增了索引。
4 僅列出查詢的字段,這樣節省記憶體。如果字段不是很多的話,也可以使用 *
5 使用批量插入語句節省互動。
6 limit基數較大的時候,用between。如
select * from tablename limit 100000,10
優化下select * from tablename between 100000,100010
但是,用between有個問題,如果中間有刪除的,則資料肯定少
7 獲取多條隨機記錄的時候,不要使用rand()。可以用php產生隨機數,然後使用in
8 避免使用null。
9 不要使用count(id),使用count(*)
10 盡量在索引中完成相關排序工作
在關鍵字段上,值得是出現在where列中的,建不建索引差別很大。查詢速度相差近100倍
並不是建了索引就有用,差的索引反而會導致查詢速度下降
索引不是越多越好,mysql維護索引需要成本
b 伺服器相關優化
1 選擇儲存引擎
是選擇myisam還是 innodb,取決於你的實際情況。
先了解下這兩個的區別:mysiam表級鎖。沒有事務機制。快讀。innodb支援事務,行級鎖。innodb是行級鎖,相對表級鎖會帶來較大的消耗。但是在系統併發量較大的情況下,效能高於mysiam。innodb的索引不僅快取索引本身還快取資料。
innodb需要更多的記憶體支援。不過,現在硬體的投入都是比較廉價的。
在這個地方需要了解個 r/w 讀寫比。show global status 檢視 com_select 表示select語句執行的次數,com_insert表示insert語句執行的次數。通過計算讀型別和寫型別的語句比例。我們大概得到個讀寫比例。
理想的情況是100:1,當r/w 小於 10:1的時候,認為是寫為主。一般而言,這個值是30:1
我們給出個儲存引擎選擇的原則:
1 採用myisam
a r/w > 100:1且update較少
b 併發不高不需要事務
c 表資料量較小
d 硬體資源有限 如記憶體小
2 採用innodb
a r/w < 20:1 or < 10:1 且update頻繁
b 表資料量較大,1000萬左右的 併發較大的
c 安全性和可用性較高。如 事務機制
關於mysql 優化 關於mysql資料庫優化
關於mysql資料庫優化 以我之愚見,資料庫的優化在於優化儲存和查詢速度 目前主要的優化我認為是優化查詢速度,查詢速度快了,提高了使用者的體驗 我認為優化主要從兩方面進行考慮,優化資料庫物件,優化sql 優化資料庫物件 1.優化表的資料型別,對於每個欄位用合適的資料型別,既能解決磁碟的儲存空間,又能...
關於MySQL 資料庫優化,推薦!
資料庫優化一方面是找出系統的瓶頸,提高mysql資料庫的整體效能,而另一方面需要合理的結構設計和引數調整,以提高使用者的相應速度,同時還要盡可能的節約系統資源,以便讓系統提供更大的負荷。此處將優化分為了兩大類,軟優化和硬優化。軟優化一般是運算元據庫即可,而硬優化則是操作伺服器硬體及引數設定。2.1....
關於mySQL資料庫的效能優化
1 wait timeout時間設定 連線數是直接反應資料庫效能好壞的關鍵指標,連線數過多,很可能有多種原因,比如,被一條sql查詢給堵了,造成後面的dml操作等待,又比如,增,刪,改,查操作很頻繁,磁碟io遇到了瓶頸,導致無法處理繁忙的請求,也許有人說增大max connections值就行了吧,...