在以前我寫過一篇關於這個方面的文章html
《【原創】爲何使用數據索引能提升效率?(本文針對mysql進行概述)(更新)》mysql
此次,主要側重點講下兩種經常使用存儲引擎。sql
咱們通常從兩個方面進行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 安全性和可用性較高。如 事務機制