mysql性能問題

最近項目使用mysql數據庫遇到瞭性能問題。單表400W以上數據時, 增,刪,改,查 的速度都明顯下降。
我們是做呼叫中心的,平均1秒鐘就要處理20個呼叫,所以 最最保守的計算 1秒鐘也要對單表進行20次插入操作,還有更多的查詢操作,所以對性能要求略高。(有點兒跑題。。。。)
 
遇到瞭問題就要解決,優化!我們優化的步驟如下(過程中遇到的困難略):
1.優化索引,將所有sql語句,尤其是速度慢的都拿出來分析,一條一條的分析。(利用 EXPLAIN )要讓所有查詢都使用到索引。
2.優化mysql數據庫本身,對my.cnf(my.ini)文件進行優化。但是個人覺得效果不是很明顯(請牛人指導。)
   my.cnf文件配置如下。(4核cpu 4G 內存)這個my.cnf 具體問題具體分析,配置起來也有很多事兒比較有講究的。
  所以需要逐步調試。(切忌不可大量修改後再重啟mysql….有可能啟動失敗。)
 
Java代碼 
[client] 
port=3306 
[mysql] 
default-character-set=utf8 
 
[mysqld] 
port=3306 
basedir="D:/Program Files/MySQL/MySQL Server 5.1/" 
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.1/Data/" 
default-character-set=utf8 
default-storage-engine=INNODB 
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
max_connections=1000 
query_cache_size=120M 
table_cache=1024M 
tmp_table_size=32M 
thread_cache_size=64 
myisam_max_sort_file_size=100G 
myisam_sort_buffer_size=64M 
key_buffer_size=512M 
 
max_allowed_packet = 32M 
max_heap_table_size = 32M 
table_open_cache = 512M 
thread_concurrency = 8 
innodb_lock_wait_timeout = 50 
bulk_insert_buffer_size = 64M 
key_cache_block_size=2048 
 
skip-external-locking 
skip-name-resolve 
 
read_buffer_size=8M 
read_rnd_buffer_size=8M 
 
sort_buffer_size=64M 
 
innodb_additional_mem_pool_size=20M 
innodb_flush_log_at_trx_commit=1 
innodb_log_buffer_size=8M 
innodb_buffer_pool_size=512M 
innodb_log_file_size=24M 
innodb_thread_concurrency=10 
 
3.分表 分表是解決大數據量的最佳方案。
    我們的mysql數據庫 單表400萬 以上數據的時候就不符合性能要求瞭(我們對性能要求有點兒高)。但是我們一天產生的數據量就達到瞭單表200萬。。總不能1天就建立一套表出來吧?? 那1,2年以後 數據庫就會有600多套表(一套表有幾十張呢,也就是上萬張單表),看著都頭疼呀。。。。。
 
4.從業務上解決,實現曲線救國。(這也是我們最後采用的方法,這個方法不一定適用其他業務)
   我們的業務是這樣,1小時對流水數據結轉一次,生成統計數據。
   最後決定生成插入流水數據的時候分2套流水表插入(一套用來保存流水數據,另一套用來結轉統計數據。)
   為什麼要分成2套呢?
   為瞭性能,用來保存流水數據的那套表就不去對它進行操作瞭。(起到備份數據之用。)
   用來結轉成統計數據的那套流水表,在結轉結束之後就會刪除掉以結轉的數據。
   這樣一來,結轉用的那套流水表的數據量就不會持續增長,也就保證瞭數據結轉的效率。
   希望對其他人 有點兒小啟示。。。。。。
   請大傢不要笑我。。我的mysql 是盜版的。。。沒有mysql DBA給我調優。更沒有人會給我訂制我們專用的mysql
   隻能這樣曲線救國的解決瞭。。。。

作者“xsxjb”
 

發佈留言