Mysql

MYSQL 表上的多個索引是導致更新和插入速度慢的原因嗎?

  • December 17, 2020

儘管沒有程式碼更新,我的(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_sizeinnodb_buffer_pool_size.

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