Mysql
mysql 在加入時凍結/崩潰
這是查詢:
SELECT nw.news_id, nw.title, nw.description, nw.url, nw.date, nw.image, nw.status, src.title as src_title, src.keyword as src_keyword, src.url as src_url, src.icon as src_icon, cat.title as cat_title FROM news as nw INNER JOIN sources as src ON nw.source=src.source_id INNER JOIN categories as cat ON nw.category=cat.category_id WHERE nw.status=1 ORDER BY nw.news_id DESC LIMIT 0,140;
新聞表大小約為 30MB。伺服器記憶體為 1GB。
我的.cnf:
[mysqld] max_connections = 120 key_buffer = 32M myisam_sort_buffer_size = 32M join_buffer_size = 8M read_buffer_size = 8M sort_buffer_size = 32M table_cache = 1024 thread_cache_size = 286 interactive_timeout = 25 wait_timeout = 1000 connect_timeout = 10 max_allowed_packet = 16M max_connect_errors = 10 query_cache_limit = 8K query_cache_size = 32K query_cache_type = 1 tmp_table_size = 16M [mysqld_safe] open_files_limit = 8192 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer = 64M sort_buffer = 64M read_buffer = 16M write_buffer = 16M local-infile=0
這是 myisam 我轉換為 innodb 以獲得更好的性能,但沒有任何改變,所以我回到了 myisam。
查詢在 localhost 上正常工作,但在伺服器中執行時,會獲得高負載並吃掉所有 RAM,直到 mysql 崩潰。只是上述查詢之一讓我高負荷!類似mysql的東西無法完成它。表有大約 50000 條記錄。
我試圖通過更改 my.cnf 參數來解決問題,但沒有成功。
詢問
關於查詢,請做這個索引
ALTER TABLE news ADD INDEX status_news_id_index (status,news_id);
並重構查詢如下:
SELECT nw.news_id, nw.title, nw.description, nw.url, nw.date, nw.image, nw.status, src.title as src_title, src.keyword as src_keyword, src.url as src_url, src.icon as src_icon, cat.title as cat_title FROM ( SELECT * FROM news WHERE status=1 ORDER BY news_id DESC LIMIT 0,140 ) as nw LEFT JOIN sources as src ON nw.source=src.source_id LEFT JOIN categories as cat ON nw.category=cat.category_id;
儲存引擎
這是您的 InnoDB 的問題:您沒有為它配置任何東西。
每個儲存引擎都有不同的記憶體。MyISAM 將
.MYI
文件中的索引頁記憶體到鍵緩衝區中。InnoDB 在您未配置的 InnoDB 緩衝池中記憶體數據和索引頁面。預設值為 8MB。/var/lib/mysql 中有一組預設的 innodb 文件
- ibdata1
- ib_logfile0
- ib_logfile1
這些必須調整大小。
由於您使用的是 MySQL 5.1,請執行以下操作:
STEP 01) 將所有 InnoDB 表轉換回 MyISAM
步驟 02)
service mysql stop
STEP 03) 將以下行添加到
my.cnf
後面tmp_table_size = 16M
innodb_file_per_table innodb_buffer_pool_size=512M innodb_log_file_size=128M innodb_fast_shutdown=0 innodb_thread_concurrency=0
步驟 04) 擦除 InnoDB 文件
rm -f /var/lib/mysql/ib*
步驟 05)
service mysql start
在啟動時,mysqld 將執行以下操作
- 創建 /var/lib/mysql/ibdata1 作為 10MB 文件,執行一些東西,最終 18MB
- 創建/var/lib/mysql/ib_logfile0 128M
- 創建/var/lib/mysql/ib_logfile1 128M
STEP 06) 將所有 MyISAM 表轉換回 InnoDB