1. 程式人生 > >轉換discuz X2.5表引擎為InnoDB

轉換discuz X2.5表引擎為InnoDB

幾乎所有PHP MySQL的開源產品中資料庫都是採用MyISAM儲存引擎,即使和交易相關的也不例 外,這應該是從查詢效能以及安裝環境考慮的。InnoDB是為處理巨大資料量時的最大效能設計,在資料量少併發小的情況下MySAM優於INNODB,但 是大資料量以及高併發寫入等會導致MySIAM力不從心。InnoDB有很多良好的特點,比如事務支援、儲存 過程、檢視、行級鎖定等,在併發很多的情況下,InnoDB的表現會比MyISAM優越,所以有時會將一些產品的資料庫儲存引擎修改為InnoDB,修改 起來其實比較簡單,只需要執行:ALTER TABLE `表名` ENGINE = InnoDB;即可,但是在discuz X2.5中表pre_forum_post在轉換時會報錯,提示#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key,大意是自增欄位必須定義成主鍵,查看了一下

pre_forum_post表可以 看到自增欄位position已經是主鍵(和tid作為聯合主鍵),有些資料提到對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只 有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引,其實這也不完全正確,其實也可以作為聯合索引,只是該欄位必須是索引的第一個 欄位,例如表pre_forum_post設定聯合主鍵使用命令PRIMARY KEY (`tid`,`position`)如果設定索引時使用PRIMARY KEY (`position`,`tid`)問題就解決了,解決方案是重建聯合索引,

執行ALTER TABLE pre_forum_post DROP PRIMARY KEY ,ADD PRIMARY KEY ( position, tid ) ;

然後再執行ALTER TABLE `pre_forum_post` ENGINE = InnoDB

這樣就沒有錯誤了,是不是很簡單呢。