Mysql

mysql 在加入時凍結/崩潰

  • December 12, 2012

這是查詢:

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

引用自:https://dba.stackexchange.com/questions/30252