Mysql
MYSQL 表上的多個索引是導致更新和插入速度慢的原因嗎?
儘管沒有程式碼更新,我的(LAMP 堆棧)網站的性能在過去幾天裡顯著下降。似乎只有特定 MySQL 表的插入、更新和刪除會導致問題。任何更新、插入或刪除作業“表”條目的頁面都需要大約 10 秒才能載入。(EG
UPDATE jobs SET title = 'sdfldsfjlk' WHERE job_id = 134324
)
SELECT
查詢似乎像以前一樣執行,但如果同時發生更新,它們似乎會變慢。該表有大約 180,000 個條目。我在 PHPMyAdmin 視圖中註意到,除了主欄位上的“正常”索引外,“entry_date”欄位上還有一個索引(見圖)。在這種情況下,這可能是一個問題嗎?我不知道為什麼會在該欄位上創建索引。
如果不是,還有什麼可能是問題的根源?我檢查了磁碟上的空間,這似乎沒問題。(7 GB 可用)根據 df.
SHOW CREATE TABLE job\G Create Table: CREATE TABLE `job` ( `job_id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL DEFAULT '0', `entry_date` date NOT NULL DEFAULT '0000-00-00', `timescale` varchar(20) COLLATE latin1_german2_ci NOT NULL DEFAULT '0000-00-00', `title` varchar(60) COLLATE latin1_german2_ci NOT NULL, `description` text COLLATE latin1_german2_ci NOT NULL, `start_date` varchar(60) COLLATE latin1_german2_ci NOT NULL, `address_town` varchar(40) COLLATE latin1_german2_ci NOT NULL DEFAULT '', `address_county` varchar(40) COLLATE latin1_german2_ci NOT NULL DEFAULT '', `postcode1` varchar(4) COLLATE latin1_german2_ci NOT NULL DEFAULT '', `postcode2` char(3) COLLATE latin1_german2_ci NOT NULL DEFAULT '', `status` tinyint(4) NOT NULL DEFAULT '0', `cat_id` int(4) NOT NULL DEFAULT '0', `price` decimal(4,2) NOT NULL DEFAULT '1.00', `emailcount` smallint(5) NOT NULL DEFAULT '-1', `emailcount2` int(11) NOT NULL DEFAULT '-1', `recemailcount` int(11) NOT NULL DEFAULT '-1', `archive` tinyint(4) NOT NULL DEFAULT '0', `post_url` varchar(100) COLLATE latin1_german2_ci NOT NULL, PRIMARY KEY (`job_id`), KEY `entrydatejob_id` (`entry_date`,`job_id`) ) ENGINE=MyISAM AUTO_INCREMENT=235844 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
更新- 首先感謝所有貢獻者。我非常感激。所以在過去的幾天裡,問題停止了,這使得試圖找出問題所在變得更加困難。但現在它似乎又回來了。讓我首先提供託管在Google云上的機器類型:g1-small(1 個 vCPU,1.7 GB 記憶體)。我將繼續使用評論者要求的更多資訊更新此內容。
要回答具體問題:
- 不,一個或兩個額外的索引
(entry_date)
不會影響更新不同title
列的性能。此外:
- 不,MySQL 5.6 的版本並不算太古老,即使缺少一些現代特性(如視窗函式)。你應該有不錯的性能和不錯的硬體。
我們只能推測手頭的問題,但可能有什麼問題或解釋:
- 舊的、低效的硬體:檢查磁碟規格,測量它的性能。
- 碎片索引/表。在此處查看 MySQL 文件和舊問題/答案,了解如何對 MyISAM 表進行碎片整理(OPTIMIZE TABLE)。
最後但並非最不重要的:
- 您的表正在使用MyISAM 引擎,這是舊消息。幾年前,InnODB 已將其替換為 MySQL 中的預設引擎。該引擎沒有積極的開發。與 InnoDB(事務、外鍵約束等)和大多數工作負載的性能相比,它缺少幾個特性。我強烈建議您更改您的表(當然在測試您的應用程序和程序不會中斷之後)以使用 InnoDB。
- 對您的問題重要的是,InnoDB 可以
SELECT
同時UPDATE
(通常)執行。MyISAM 完全鎖定表;更新或選擇必須在選擇或更新開始之前完成。- 從 MyISAM 切換到 InnoDB 時,一定要調整
key_buffer_size
和innodb_buffer_pool_size
.