最近項目使用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”