關於MySQL數據庫優化的部分整理

在以前我寫過一篇關於這個方面的文章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

R/w < 20:1 OR < 10:1 且update頻繁

b 表數據量較大,1000萬左右的 併發較大的

c 安全性和可用性較高。如 事務機制

相關文章
相關標籤/搜索