簡體   English   中英

Drupal 數據庫性能調整 - 從 MyISAM 切換特定表到 InnoDB

[英]Drupal database performance tuning - switching particular tables to InnoDB from MyISAM

我有一個 drupal 網站,它的流量很低,但自定義提要導入器模塊添加了大量新內容。 該模塊為導入的文章創建節點和關聯的分類法。

目前,我相信我們所有的 drupal 表都是 MyISAM。 我正在考慮切換繁重的寫表:

  1. 節點
  2. 看門狗
  3. 會話
  4. 訪問日志
  5. 您還會考慮哪些其他表?

到 InnoDB。

你認為這是個好主意嗎? 我可能會看到性能提升嗎? 我將其視為整體解決方案的一部分的原因是,在導入時,mysqld 經常用完 memory 並使整個系統停機。 它僅在導入時發生。

我最終會看到這樣的事情:

xml import at [01/Jun/2011:13:26:38 -0400] "GET /import/xml_import HTTP/1.1" 200
....
14:02:38 [ERROR] /usr/libexec/mysqld: Out of memory (Needed 1049152 bytes)

盒子是 x32,所以我們僅限於 memory 的數量,我們可以分配給 mySql。 我們還有 PHP、JAVA、SVN 和更多運行在這個盒子上......它按原樣征稅。 呵呵。

因此,一般來說,任何關於性能調整數據庫的輸入都會受到贊賞,我現在正在做研究。

TIA。

編輯:(我已經包含了我當前的 my.cnf):


[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
tmpdir=/var/lib/mysql/tmp
#old_passwords=1
skip-locking
key_buffer = 2048M #doubled from 1024
max_allowed_packet = 16M
table_cache = 5000
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 64 #doubled from 32
thread_concurrency = 8
query_cache_size = 1024M #doubled from 512
tmp_table_size=1024M
max_heap_table_size=1024M
back_log = 100
max_connect_errors = 10000
join_buffer_size=1M
open-files = 20000

interactive_timeout = 600
wait_timeout = 600

ft_min_word_len=3
ft_stopword_file=''
max_connections=1000

#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_file_size = 100M

#innodb_buffer_pool_size = 384M
#innodb_additional_mem_pool_size = 20M


#log-slow-queries=/var/lib/mysqllogs/slow-log
#long_query_time=2   
#log-queries-not-using-indexes

#log-bin=/var/lib/mysqllogs/bin-log
#log-slave-updates
#expire_logs_days = 14
server-id       = 1 

[mysql.server]
user=mysql
#basedir=/var/lib  

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=65536

如果您確定該網站的訪問量較低,請務必保留在 MyISAM 中。

但是,如果這種模式發生變化並且您再次成為高流量, 您可以將所有內容配置到 InnoDB 中,主要有兩個原因

原因 #1 :InnoDB 執行行級鎖定。 對於 MyISAM,任何執行的 INSERT、UPDATE 或 DELETE 查詢都會導致全表鎖定。 即使在低流量網站中,也可能存在兩個或多個數據庫連接鎖定同一個表。 使用 InnoDB,完全消除了這種可能性。

原因 #2InnoDB 緩存數據和索引。 MyISAM 只緩存索引頁。

鍵緩存(大小由 key_buffer_size 決定)保存 MyISAM 表的索引頁。 總是有磁盤 I/O 來從 MyISAM 讀取數據。 第一次讀取的記錄會將用於查找行的索引頁緩存到鍵緩存中。 隨后的查找將在密鑰緩存中找到所需的密鑰,但總會有強制性的磁盤 I/O 來獲取數據。 對於 InnoDB,數據和索引頁面都駐留在 InnoDB 緩沖池中(大小為 innodb_buffer_pool_size)。 緩沖池中緩存的所有內容都大大減少了磁盤 I/O。

我一直推薦使用 InnoDB 而不是 MyISAM 的 Drupal 數據庫。 使用直接 MySQL 實際上很容易轉換

在那之前,MyISAM 是您所需要的全部火力, 尤其是在 RAM 適中的服務器上

一般來說,InnoDB 比 MyISAM 慢,因為 InnoDB 是原子的,而 MyISAM 不是。 通過權衡性能,您可以獲得數據可靠性。

如果可以,請在導入前禁用索引,您將看到性能提升。 一次重建所有索引而不是每次插入都更有效。

您不想將 mysql 配置為超過可用的 memory。 memory 設置分布在多個設置中。 您可以使用類似這樣的 http://mysqltuner.pl/mysqltuner.pl來確定您的 mysql 安裝的調整程度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM