[英]Drupal database performance tuning - switching particular tables to InnoDB from MyISAM
我有一個 drupal 網站,它的流量很低,但自定義提要導入器模塊添加了大量新內容。 該模塊為導入的文章創建節點和關聯的分類法。
目前,我相信我們所有的 drupal 表都是 MyISAM。 我正在考慮切換繁重的寫表:
到 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,完全消除了這種可能性。
原因 #2 : InnoDB 緩存數據和索引。 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.