簡體   English   中英

創建索引后查詢速度很快但幾分鍾后MySQL速度慢

[英]Queries fast after creating an index but slow after a few minutes MySQL

我有幾個表,行數約為1500萬。 當我在id列上創建一個idex然后我執行一個簡單的查詢,如SELECT * FROM my_table WHERE id = 1我在一秒鍾內檢索數據。 但是,幾分鍾后,如果我用不同的id執行查詢,則需要15秒。

我確定它不是查詢緩存,因為我一直在嘗試不同的ID以確保我沒有從緩存中檢索。 此外,我使用EXPLAIN來確保它正在使用的索引。

服務器的規格是:

CPU: Intel Dual Xeon 5405 Harpertown 2.0Ghz Quad Core
RAM: 8GB
Hard drive 2: 146GB SAS (15k rpm)

我注意到的另一件事是,如果我執行REPAIR TABLE my_table ,查詢會在一秒鍾之內再次出現。 我假設正在緩存某些東西,無論是表還是索引。 如果是這樣,有沒有辦法告訴MySQL保持緩存。 根據服務器的規格,在索引表上花費大約13秒是正常的嗎? 索引不是唯一的,每個查詢返回大約3000行。

注意:我正在使用MyISAM,我知道這些表中不會有任何寫入,所有查詢都將是讀取數據。

求助:謝謝你的答案,正如你們許多人指出的那樣是key_buffer_size 。我還使用與索引相同的列重新排序表,因此記錄不會分散,現在我在1秒內一直執行查詢。

請提供

SHOW CREATE TABLE
SHOW VARIABLES LIKE '%buffer%';

可能的原因:

  • key_buffer_size (使用MyISAM時)不是RAM的20%; innodb_buffer_pool_size不是可用內存的70%(使用InnoDB時)。
  • 另一個查詢(或一組查詢)進入並“吹出緩存”(key_buffer或buffer_pool)。 尋找這樣的查詢)。
  • 使用InnoDB時,您沒有PRIMARY KEY (擁有這樣的東西非常重要。)

對於3000行需要15秒加載,我推斷:

  • 表的緩存(不一定是索引)被吹滅了,並且
  • 3000行散布在表格周圍(因此獲取一行對查找后續行沒有多大幫助)。

內存分配博客: http//mysql.rjweb.org/doc.php/memory

根據服務器的規格,在索引表上花費大約13秒是正常的嗎?

響應時間的高度差異表明出現了問題。 只有8 GB的RAM和1500萬行,您可能沒有足夠的RAM來將索引保留在內存中。

是否在服務器上啟用了交換? 這可以解釋響應時間的極端跳躍。

使用tophtopglances等工具調查內存情況。

暫無
暫無

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

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